Browse Source

Fix concurrency issue in OIDC provider

master
Francis PEROT 5 years ago
committed by sispeo
parent
commit
9376f843c7
  1. 7
      toolbox/oidc_verifier.go

7
toolbox/oidc_verifier.go

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"net/url" "net/url"
"sync"
"time" "time"
"github.com/cloudtrust/keycloak-client" "github.com/cloudtrust/keycloak-client"
@ -26,6 +27,7 @@ type verifierCache struct {
errorTolerance time.Duration errorTolerance time.Duration
tokenURL *url.URL tokenURL *url.URL
verifiers map[string]cachedVerifier verifiers map[string]cachedVerifier
verifiersMutex sync.RWMutex
} }
type cachedVerifier struct { type cachedVerifier struct {
@ -42,11 +44,14 @@ func NewVerifierCache(tokenURL *url.URL, timeToLive time.Duration, errorToleranc
errorTolerance: errorTolerance, errorTolerance: errorTolerance,
tokenURL: tokenURL, tokenURL: tokenURL,
verifiers: make(map[string]cachedVerifier), verifiers: make(map[string]cachedVerifier),
verifiersMutex: sync.RWMutex{},
} }
} }
func (vc *verifierCache) GetOidcVerifier(realm string) (OidcVerifier, error) { func (vc *verifierCache) GetOidcVerifier(realm string) (OidcVerifier, error) {
vc.verifiersMutex.RLock()
v, ok := vc.verifiers[realm] v, ok := vc.verifiers[realm]
vc.verifiersMutex.RUnlock()
if ok && v.isValid() { if ok && v.isValid() {
return &v, nil return &v, nil
} }
@ -67,7 +72,9 @@ func (vc *verifierCache) GetOidcVerifier(realm string) (OidcVerifier, error) {
invalidateOnErrorAt: time.Now().Add(vc.errorTolerance), invalidateOnErrorAt: time.Now().Add(vc.errorTolerance),
verifier: ov, verifier: ov,
} }
vc.verifiersMutex.Lock()
vc.verifiers[realm] = res vc.verifiers[realm] = res
vc.verifiersMutex.Unlock()
return &res, nil return &res, nil
} }

Loading…
Cancel
Save