68 lines
1.8 KiB
Go
68 lines
1.8 KiB
Go
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)
|
|
}
|
|
}
|