55 lines
2.1 KiB
Go
55 lines
2.1 KiB
Go
|
|
package client
|
||
|
|
|
||
|
|
import (
|
||
|
|
"net/http"
|
||
|
|
"net/http/httptest"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestMiddlewareAuthorizesAndAddsPrincipal(t *testing.T) {
|
||
|
|
authorizationServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
if r.Header.Get(DefaultHeader) != "gl_test_key_that_is_long_enough_for_client" {
|
||
|
|
t.Errorf("unexpected API key")
|
||
|
|
}
|
||
|
|
w.Header().Set("Content-Type", "application/json")
|
||
|
|
w.Write([]byte(`{"allowed":true,"tenant_id":"tenant-1","tenant_slug":"nmbs","application_id":"app-1","application_slug":"guess","api_key_id":"key-1","api_key_name":"test"}`))
|
||
|
|
}))
|
||
|
|
defer authorizationServer.Close()
|
||
|
|
|
||
|
|
client, err := New(Config{BaseURL: authorizationServer.URL, Tenant: "nmbs", Application: "guess"})
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("New() error = %v", err)
|
||
|
|
}
|
||
|
|
handler := client.Middleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
principal, ok := PrincipalFromContext(r.Context())
|
||
|
|
if !ok || principal.TenantSlug != "nmbs" {
|
||
|
|
t.Fatalf("missing principal: %#v", principal)
|
||
|
|
}
|
||
|
|
if r.Header.Get(DefaultHeader) != "" {
|
||
|
|
t.Fatal("middleware must not forward the credential")
|
||
|
|
}
|
||
|
|
w.WriteHeader(http.StatusNoContent)
|
||
|
|
}))
|
||
|
|
request := httptest.NewRequest(http.MethodGet, "http://nmbs.guess.local/guesses", nil)
|
||
|
|
request.Header.Set(DefaultHeader, "gl_test_key_that_is_long_enough_for_client")
|
||
|
|
recorder := httptest.NewRecorder()
|
||
|
|
handler.ServeHTTP(recorder, request)
|
||
|
|
if recorder.Code != http.StatusNoContent {
|
||
|
|
t.Fatalf("status = %d, body = %s", recorder.Code, recorder.Body.String())
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestMiddlewareFailsClosedWithoutKey(t *testing.T) {
|
||
|
|
client, err := New(Config{BaseURL: "http://go-loose", Application: "guess"})
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("New() error = %v", err)
|
||
|
|
}
|
||
|
|
called := false
|
||
|
|
handler := client.Middleware(http.HandlerFunc(func(http.ResponseWriter, *http.Request) { called = true }))
|
||
|
|
recorder := httptest.NewRecorder()
|
||
|
|
handler.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil))
|
||
|
|
if recorder.Code != http.StatusUnauthorized || called {
|
||
|
|
t.Fatalf("status = %d, called = %v", recorder.Code, called)
|
||
|
|
}
|
||
|
|
}
|