@@ -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