Skip to content

Commit 1f670eb

Browse files
authored
test(auth): complete test suite for unauthorized scenarios (#220)
Signed-off-by: Marc Nuri <[email protected]>
1 parent aa14e31 commit 1f670eb

File tree

3 files changed

+284
-151
lines changed

3 files changed

+284
-151
lines changed

pkg/http/authorization.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ func AuthorizationMiddleware(requireOAuth bool, serverURL string, oidcProvider *
4141
klog.V(1).Infof("Authentication failed - missing or invalid bearer token: %s %s from %s", r.Method, r.URL.Path, r.RemoteAddr)
4242

4343
if serverURL == "" {
44-
w.Header().Set("WWW-Authenticate", fmt.Sprintf(`Bearer realm="Kubernetes MCP Server", audience="%s", error="invalid_token"`, audience))
44+
w.Header().Set("WWW-Authenticate", fmt.Sprintf(`Bearer realm="Kubernetes MCP Server", audience="%s", error="missing_token"`, audience))
4545
} else {
46-
w.Header().Set("WWW-Authenticate", fmt.Sprintf(`Bearer realm="Kubernetes MCP Server", audience="%s"", resource_metadata="%s%s", error="invalid_token"`, audience, serverURL, oauthProtectedResourceEndpoint))
46+
w.Header().Set("WWW-Authenticate", fmt.Sprintf(`Bearer realm="Kubernetes MCP Server", audience="%s"", resource_metadata="%s%s", error="missing_token"`, audience, serverURL, oauthProtectedResourceEndpoint))
4747
}
4848
http.Error(w, "Unauthorized: Bearer token required", http.StatusUnauthorized)
4949
return
@@ -103,7 +103,7 @@ func AuthorizationMiddleware(requireOAuth bool, serverURL string, oidcProvider *
103103
// with the other token in the headers (TODO: still need to validate aud and exp of this token separately).
104104
_, _, err = mcpServer.VerifyTokenAPIServer(r.Context(), token, audience)
105105
if err != nil {
106-
klog.V(1).Infof("Authentication failed - token validation error: %s %s from %s, error: %v", r.Method, r.URL.Path, r.RemoteAddr, err)
106+
klog.V(1).Infof("Authentication failed - API Server token validation error: %s %s from %s, error: %v", r.Method, r.URL.Path, r.RemoteAddr, err)
107107

108108
if serverURL == "" {
109109
w.Header().Set("WWW-Authenticate", fmt.Sprintf(`Bearer realm="Kubernetes MCP Server", audience="%s", error="invalid_token"`, audience))

pkg/http/authorization_test.go

Lines changed: 0 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package http
22

33
import (
4-
"net/http"
5-
"net/http/httptest"
64
"strings"
75
"testing"
86

@@ -220,103 +218,3 @@ func TestJWTClaimsGetScopes(t *testing.T) {
220218
}
221219
})
222220
}
223-
224-
func TestAuthorizationMiddleware(t *testing.T) {
225-
// Create a mock handler
226-
handlerCalled := false
227-
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
228-
handlerCalled = true
229-
w.WriteHeader(http.StatusOK)
230-
})
231-
232-
t.Run("OAuth disabled - passes through", func(t *testing.T) {
233-
handlerCalled = false
234-
235-
// Create middleware with OAuth disabled
236-
middleware := AuthorizationMiddleware(false, "", nil, nil)
237-
wrappedHandler := middleware(handler)
238-
239-
// Create request without authorization header
240-
req := httptest.NewRequest("GET", "/test", nil)
241-
w := httptest.NewRecorder()
242-
243-
wrappedHandler.ServeHTTP(w, req)
244-
245-
if !handlerCalled {
246-
t.Error("expected handler to be called when OAuth is disabled")
247-
}
248-
if w.Code != http.StatusOK {
249-
t.Errorf("expected status 200, got %d", w.Code)
250-
}
251-
})
252-
253-
t.Run("healthz endpoint - passes through", func(t *testing.T) {
254-
handlerCalled = false
255-
256-
// Create middleware with OAuth enabled
257-
middleware := AuthorizationMiddleware(true, "", nil, nil)
258-
wrappedHandler := middleware(handler)
259-
260-
// Create request to healthz endpoint
261-
req := httptest.NewRequest("GET", "/healthz", nil)
262-
w := httptest.NewRecorder()
263-
264-
wrappedHandler.ServeHTTP(w, req)
265-
266-
if !handlerCalled {
267-
t.Error("expected handler to be called for healthz endpoint")
268-
}
269-
if w.Code != http.StatusOK {
270-
t.Errorf("expected status 200, got %d", w.Code)
271-
}
272-
})
273-
274-
t.Run("OAuth enabled - missing token", func(t *testing.T) {
275-
handlerCalled = false
276-
277-
// Create middleware with OAuth enabled
278-
middleware := AuthorizationMiddleware(true, "", nil, nil)
279-
wrappedHandler := middleware(handler)
280-
281-
// Create request without authorization header
282-
req := httptest.NewRequest("GET", "/test", nil)
283-
w := httptest.NewRecorder()
284-
285-
wrappedHandler.ServeHTTP(w, req)
286-
287-
if handlerCalled {
288-
t.Error("expected handler NOT to be called when token is missing")
289-
}
290-
if w.Code != http.StatusUnauthorized {
291-
t.Errorf("expected status 401, got %d", w.Code)
292-
}
293-
if !strings.Contains(w.Body.String(), "Bearer token required") {
294-
t.Errorf("expected bearer token error message, got %s", w.Body.String())
295-
}
296-
})
297-
298-
t.Run("OAuth enabled - invalid token format", func(t *testing.T) {
299-
handlerCalled = false
300-
301-
// Create middleware with OAuth enabled
302-
middleware := AuthorizationMiddleware(true, "", nil, nil)
303-
wrappedHandler := middleware(handler)
304-
305-
// Create request with invalid bearer token
306-
req := httptest.NewRequest("GET", "/test", nil)
307-
req.Header.Set("Authorization", "Bearer invalid-token")
308-
w := httptest.NewRecorder()
309-
310-
wrappedHandler.ServeHTTP(w, req)
311-
312-
if handlerCalled {
313-
t.Error("expected handler NOT to be called when token is invalid")
314-
}
315-
if w.Code != http.StatusUnauthorized {
316-
t.Errorf("expected status 401, got %d", w.Code)
317-
}
318-
if !strings.Contains(w.Body.String(), "Invalid token") {
319-
t.Errorf("expected invalid token error message, got %s", w.Body.String())
320-
}
321-
})
322-
}

0 commit comments

Comments
 (0)