@@ -56,7 +56,7 @@ func AuthorizationMiddleware(requireOAuth bool, serverURL string, oidcProvider *
5656			// rejected already. 
5757			claims , err  :=  ParseJWTClaims (token )
5858			if  err  ==  nil  &&  claims  !=  nil  {
59- 				err  =  claims .Validate (audience )
59+ 				err  =  claims .Validate (r . Context (),  audience ,  oidcProvider )
6060			}
6161			if  err  !=  nil  {
6262				klog .V (1 ).Infof ("Authentication failed - JWT validation error: %s %s from %s, error: %v" , r .Method , r .URL .Path , r .RemoteAddr , err )
@@ -70,21 +70,6 @@ func AuthorizationMiddleware(requireOAuth bool, serverURL string, oidcProvider *
7070				return 
7171			}
7272
73- 			if  oidcProvider  !=  nil  {
74- 				// If OIDC Provider is configured, this token must be validated against it. 
75- 				if  err  :=  validateTokenWithOIDC (r .Context (), oidcProvider , token , audience ); err  !=  nil  {
76- 					klog .V (1 ).Infof ("Authentication failed - OIDC token validation error: %s %s from %s, error: %v" , r .Method , r .URL .Path , r .RemoteAddr , err )
77- 
78- 					if  serverURL  ==  ""  {
79- 						w .Header ().Set ("WWW-Authenticate" , fmt .Sprintf (`Bearer realm="Kubernetes MCP Server", audience="%s", error="invalid_token"` , audience ))
80- 					} else  {
81- 						w .Header ().Set ("WWW-Authenticate" , fmt .Sprintf (`Bearer realm="Kubernetes MCP Server", audience="%s"", resource_metadata="%s%s", error="invalid_token"` , audience , serverURL , oauthProtectedResourceEndpoint ))
82- 					}
83- 					http .Error (w , "Unauthorized: Invalid token" , http .StatusUnauthorized )
84- 					return 
85- 				}
86- 			}
87- 
8873			// Scopes are likely to be used for authorization. 
8974			scopes  :=  claims .GetScopes ()
9075			klog .V (2 ).Infof ("JWT token validated - Scopes: %v" , scopes )
@@ -138,6 +123,7 @@ var allSignatureAlgorithms = []jose.SignatureAlgorithm{
138123
139124type  JWTClaims  struct  {
140125	jwt.Claims 
126+ 	Token  string  `json:"-"` 
141127	Scope  string  `json:"scope,omitempty"` 
142128}
143129
@@ -149,10 +135,21 @@ func (c *JWTClaims) GetScopes() []string {
149135}
150136
151137// Validate Checks if the JWT claims are valid and if the audience matches the expected one. 
152- func  (c  * JWTClaims ) Validate (audience  string ) error  {
153- 	return  c .Claims .Validate (jwt.Expected {
154- 		AnyAudience : jwt.Audience {audience },
155- 	})
138+ func  (c  * JWTClaims ) Validate (ctx  context.Context , audience  string , provider  * oidc.Provider ) error  {
139+ 	if  err  :=  c .Claims .Validate (jwt.Expected {AnyAudience : jwt.Audience {audience }}); err  !=  nil  {
140+ 		return  fmt .Errorf ("JWT token validation error: %v" , err )
141+ 	}
142+ 	if  provider  !=  nil  {
143+ 		verifier  :=  provider .Verifier (& oidc.Config {
144+ 			ClientID : audience ,
145+ 		})
146+ 
147+ 		_ , err  :=  verifier .Verify (ctx , c .Token )
148+ 		if  err  !=  nil  {
149+ 			return  fmt .Errorf ("OIDC token validation error: %v" , err )
150+ 		}
151+ 	}
152+ 	return  nil 
156153}
157154
158155func  ParseJWTClaims (token  string ) (* JWTClaims , error ) {
@@ -162,18 +159,6 @@ func ParseJWTClaims(token string) (*JWTClaims, error) {
162159	}
163160	claims  :=  & JWTClaims {}
164161	err  =  tkn .UnsafeClaimsWithoutVerification (claims )
162+ 	claims .Token  =  token 
165163	return  claims , err 
166164}
167- 
168- func  validateTokenWithOIDC (ctx  context.Context , provider  * oidc.Provider , token , audience  string ) error  {
169- 	verifier  :=  provider .Verifier (& oidc.Config {
170- 		ClientID : audience ,
171- 	})
172- 
173- 	_ , err  :=  verifier .Verify (ctx , token )
174- 	if  err  !=  nil  {
175- 		return  fmt .Errorf ("JWT token verification failed: %v" , err )
176- 	}
177- 
178- 	return  nil 
179- }
0 commit comments