feat: add backend jwt middleware

This commit is contained in:
Philipp
2026-06-10 16:23:55 +02:00
parent d87d8c6be7
commit 9947286b1e
12 changed files with 795 additions and 20 deletions
+67
View File
@@ -0,0 +1,67 @@
package auth
import (
"net/http"
"net/http/httptest"
"testing"
"time"
)
func TestRequireAuthRejectsMissingToken(t *testing.T) {
env := newTestJWTEnv(t)
validator, err := NewValidator(env.issuer, env.jwksURL, WithNow(func() time.Time {
return env.now
}), WithHTTPClient(env.client))
if err != nil {
t.Fatalf("NewValidator() error = %v", err)
}
middleware := NewMiddleware(validator)
handler := middleware.RequireAuth(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNoContent)
}))
req := httptest.NewRequest(http.MethodGet, "/me", nil)
rec := httptest.NewRecorder()
handler.ServeHTTP(rec, req)
if rec.Code != http.StatusUnauthorized {
t.Fatalf("status = %d, want %d", rec.Code, http.StatusUnauthorized)
}
}
func TestRequireAuthAcceptsValidToken(t *testing.T) {
env := newTestJWTEnv(t)
validator, err := NewValidator(env.issuer, env.jwksURL, WithNow(func() time.Time {
return env.now
}), WithHTTPClient(env.client))
if err != nil {
t.Fatalf("NewValidator() error = %v", err)
}
middleware := NewMiddleware(validator)
handler := middleware.RequireAuth(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
principal, ok := PrincipalFromRequest(r)
if !ok {
t.Fatal("principal missing from request")
}
if principal.Subject != testSubject {
t.Fatalf("principal.Subject = %q, want %q", principal.Subject, testSubject)
}
if principal.Email != "user@example.test" {
t.Fatalf("principal.Email = %q", principal.Email)
}
w.WriteHeader(http.StatusNoContent)
}))
req := httptest.NewRequest(http.MethodGet, "/me", nil)
req.Header.Set("Authorization", "Bearer "+env.token(t, tokenOptions{}))
rec := httptest.NewRecorder()
handler.ServeHTTP(rec, req)
if rec.Code != http.StatusNoContent {
t.Fatalf("status = %d, want %d", rec.Code, http.StatusNoContent)
}
}