Dont panic on first time oath failure, error and continue...
diff --git a/oauth.go b/oauth.go
index 5ce1cbf..986fd40 100644
--- a/oauth.go
+++ b/oauth.go
@@ -14,7 +14,7 @@
)
var (
- gPkey *rsa.PublicKey
+ gPkey *rsa.PublicKey = nil
rwMutex sync.RWMutex
)
@@ -59,16 +59,14 @@
*/
func (s *HTTPScaffold) CreateOAuth(keyURL string) OAuthService {
- pk, err := getPubicKey(keyURL)
+ pk, err := getPublicKey(keyURL)
if err != nil {
- panic("Unable to retreive Public Key")
+ setPkSafe(pk)
}
- setPkSafe(pk)
/*
- Routine that will fetch & update the public keys in the global
- variable periodically
+ Routine that will fetch & update the public keys in safe manner
*/
- updatePulicKeysPeriodic(keyURL)
+ updatePublicKeysPeriodic(keyURL)
return &OAuth{}
@@ -106,20 +104,28 @@
return func(rw http.ResponseWriter, r *http.Request, ps httprouter.Params) {
+ /* Parse the JWT from the input request */
jwt, err := jws.ParseJWTFromRequest(r)
if err != nil {
WriteErrorResponse(http.StatusBadRequest, err.Error(), rw)
return
}
- /* Validate the JWT */
- err = jwt.Validate(getPkSafe(), crypto.SigningMethodRS256)
+ /* Get the pulic key from cache */
+ pk := getPkSafe()
+ if pk == nil {
+ WriteErrorResponse(http.StatusBadRequest, "Public key not configured. Validation failed.", rw)
+ return
+ }
+
+ /* Validate the token */
+ err = jwt.Validate(pk, crypto.SigningMethodRS256)
if err != nil {
WriteErrorResponse(http.StatusBadRequest, err.Error(), rw)
return
}
- /* Set the params in the request */
+ /* Set the input params in the request */
r = SetParamsInRequest(r, ps)
next.ServeHTTP(rw, r)
}
@@ -144,17 +150,17 @@
}
/*
-updatePulicKeysPeriodic updates the cache periodically (every day)
+updatePulicKeysPeriodic updates the cache periodically (every hour)
*/
-func updatePulicKeysPeriodic(keyURL string) {
+func updatePublicKeysPeriodic(keyURL string) {
- ticker := time.NewTicker(24 * 3600 * time.Second)
+ ticker := time.NewTicker(3600 * time.Second)
quit := make(chan struct{})
go func() {
for {
select {
case <-ticker.C:
- pk, err := getPubicKey(keyURL)
+ pk, err := getPublicKey(keyURL)
if err == nil {
setPkSafe(pk)
}
@@ -169,22 +175,26 @@
/*
getPubicKey: Loads the Public key in to memory and returns it.
*/
-func getPubicKey(keyURL string) (*rsa.PublicKey, error) {
+func getPublicKey(keyURL string) (*rsa.PublicKey, error) {
client := &http.Client{}
+
+ /* Connect to the server to fetch Key details */
r, err := client.Get(keyURL)
if err != nil {
return nil, err
}
defer r.Body.Close()
+
+ /* Decode the SSO Key */
ssoKey := &ssoKey{}
err = json.NewDecoder(r.Body).Decode(ssoKey)
if err != nil {
return nil, err
}
- /* Retrieve the Public Key */
+ /* Retrieve the Public Key from SSO Key */
publicKey, err := crypto.ParseRSAPublicKeyFromPEM([]byte(ssoKey.Value))
if err != nil {
return nil, err