@@ -56,7 +56,7 @@ func AuthorizationMiddleware(requireOAuth bool, serverURL string, oidcProvider *
56
56
// rejected already.
57
57
claims , err := ParseJWTClaims (token )
58
58
if err == nil && claims != nil {
59
- err = claims .Validate (audience )
59
+ err = claims .Validate (r . Context (), audience , oidcProvider )
60
60
}
61
61
if err != nil {
62
62
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 *
70
70
return
71
71
}
72
72
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
-
88
73
// Scopes are likely to be used for authorization.
89
74
scopes := claims .GetScopes ()
90
75
klog .V (2 ).Infof ("JWT token validated - Scopes: %v" , scopes )
@@ -138,6 +123,7 @@ var allSignatureAlgorithms = []jose.SignatureAlgorithm{
138
123
139
124
type JWTClaims struct {
140
125
jwt.Claims
126
+ Token string `json:"-"`
141
127
Scope string `json:"scope,omitempty"`
142
128
}
143
129
@@ -149,10 +135,21 @@ func (c *JWTClaims) GetScopes() []string {
149
135
}
150
136
151
137
// 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
156
153
}
157
154
158
155
func ParseJWTClaims (token string ) (* JWTClaims , error ) {
@@ -162,18 +159,6 @@ func ParseJWTClaims(token string) (*JWTClaims, error) {
162
159
}
163
160
claims := & JWTClaims {}
164
161
err = tkn .UnsafeClaimsWithoutVerification (claims )
162
+ claims .Token = token
165
163
return claims , err
166
164
}
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