@@ -56,6 +56,7 @@ type Verifier struct {
5656 restConfig * rest.Config
5757 eventPolicyLister v1alpha1.EventPolicyLister
5858 trustBundleConfigMapLister corev1listers.ConfigMapNamespaceLister
59+ featureStore * feature.Store
5960 m sync.RWMutex
6061 provider * oidc.Provider
6162}
@@ -70,24 +71,15 @@ type IDToken struct {
7071}
7172
7273func NewVerifier (ctx context.Context , eventPolicyLister listerseventingv1alpha1.EventPolicyLister , trustBundleConfigMapLister corev1listers.ConfigMapNamespaceLister , cmw configmap.Watcher ) * Verifier {
74+ featureStore := feature .NewStore (logging .FromContext (ctx ).Named ("feature-config-store" ), func (name string , value interface {}) {})
75+ featureStore .WatchConfigs (cmw )
76+
7377 tokenHandler := & Verifier {
7478 logger : logging .FromContext (ctx ).With ("component" , "oidc-token-handler" ),
7579 restConfig : injection .GetConfig (ctx ),
7680 eventPolicyLister : eventPolicyLister ,
7781 trustBundleConfigMapLister : trustBundleConfigMapLister ,
78- }
79-
80- featureStore := feature .NewStore (logging .FromContext (ctx ).Named ("feature-config-store" ), func (name string , value interface {}) {
81- if features , ok := value .(feature.Flags ); ok {
82- if err := tokenHandler .initOIDCProvider (ctx , features ); err != nil {
83- tokenHandler .logger .Error (fmt .Sprintf ("could not initialize provider after config update. You can ignore this message, when the %s feature is disabled" , feature .OIDCAuthentication ), zap .Error (err ))
84- }
85- }
86- })
87- featureStore .WatchConfigs (cmw )
88-
89- if err := tokenHandler .initOIDCProvider (ctx , featureStore .Load ()); err != nil {
90- tokenHandler .logger .Error (fmt .Sprintf ("could not initialize provider. You can ignore this message, when the %s feature is disabled" , feature .OIDCAuthentication ), zap .Error (err ))
82+ featureStore : featureStore ,
9183 }
9284
9385 return tokenHandler
@@ -100,6 +92,11 @@ func (v *Verifier) VerifyRequest(ctx context.Context, features feature.Flags, re
10092 return nil
10193 }
10294
95+ if err := v .ensureProvider (ctx , features ); err != nil {
96+ resp .WriteHeader (http .StatusInternalServerError )
97+ return fmt .Errorf ("failed to initialize OIDC provider: %w" , err )
98+ }
99+
103100 idToken , err := v .verifyAuthN (ctx , requiredOIDCAudience , req , resp )
104101 if err != nil {
105102 return fmt .Errorf ("authentication of request could not be verified: %w" , err )
@@ -123,6 +120,11 @@ func (v *Verifier) VerifyRequestFromSubject(ctx context.Context, features featur
123120 return nil
124121 }
125122
123+ if err := v .ensureProvider (ctx , features ); err != nil {
124+ resp .WriteHeader (http .StatusInternalServerError )
125+ return fmt .Errorf ("failed to initialize OIDC provider: %w" , err )
126+ }
127+
126128 idToken , err := v .verifyAuthN (ctx , requiredOIDCAudience , req , resp )
127129 if err != nil {
128130 return fmt .Errorf ("authentication of request could not be verified: %w" , err )
@@ -147,6 +149,11 @@ func (v *Verifier) VerifyRequestFromSubjectsWithFilters(ctx context.Context, fea
147149 return nil
148150 }
149151
152+ if err := v .ensureProvider (ctx , features ); err != nil {
153+ resp .WriteHeader (http .StatusInternalServerError )
154+ return fmt .Errorf ("failed to initialize OIDC provider: %w" , err )
155+ }
156+
150157 idToken , err := v .verifyAuthN (ctx , requiredOIDCAudience , req , resp )
151158 if err != nil {
152159 return fmt .Errorf ("authentication of request could not be verified: %w" , err )
@@ -236,6 +243,24 @@ func (v *Verifier) verifyAuthZBySubjectsWithFilters(ctx context.Context, feature
236243 return nil
237244}
238245
246+ func (v * Verifier ) ensureProvider (ctx context.Context , features feature.Flags ) error {
247+ v .m .RLock ()
248+ if v .provider != nil {
249+ v .m .RUnlock ()
250+ return nil
251+ }
252+ v .m .RUnlock ()
253+
254+ v .m .Lock ()
255+ defer v .m .Unlock ()
256+
257+ if v .provider != nil {
258+ return nil
259+ }
260+
261+ return v .initOIDCProvider (ctx , features )
262+ }
263+
239264// verifyJWT verifies the given JWT for the expected audience and returns the parsed ID token.
240265func (v * Verifier ) verifyJWT (ctx context.Context , jwt , audience string ) (* IDToken , error ) {
241266 v .m .RLock ()
@@ -289,8 +314,6 @@ func (v *Verifier) initOIDCProvider(ctx context.Context, features feature.Flags)
289314 }
290315
291316 // provider is valid, update it
292- v .m .Lock ()
293- defer v .m .Unlock ()
294317 v .provider = provider
295318
296319 v .logger .Debug ("updated OIDC provider config" , zap .Any ("discovery-config" , discovery ))
0 commit comments