diff --git a/client.go b/client.go index 6ff38c9..0f5612b 100644 --- a/client.go +++ b/client.go @@ -28,6 +28,7 @@ type PrivilegeHandler struct { *sync.RWMutex client *http.Client baseURL string + apiKey string privileges map[string]map[string]*CompanyPrivileges } @@ -41,6 +42,13 @@ func WithBaseURL(url string) OptsFunc { } } +// WithAPIKey sets an API key used as a Bearer token when fetching privileges +func WithAPIKey(key string) OptsFunc { + return func(handler *PrivilegeHandler) { + handler.apiKey = key + } +} + // New creates a new PrivilegeHandler. Pass OptsFuncs to configure. func New(opts ...OptsFunc) *PrivilegeHandler { handler := &PrivilegeHandler{ @@ -57,7 +65,16 @@ func New(opts ...OptsFunc) *PrivilegeHandler { // Fetch the initial set of privileges from an authz-service func (h *PrivilegeHandler) Fetch() error { - resp, err := h.client.Get(fmt.Sprintf("%s/authz", h.baseURL)) + req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/authz", h.baseURL), nil) + if err != nil { + return err + } + + if h.apiKey != "" { + req.Header.Set("Authorization", "Bearer "+h.apiKey) + } + + resp, err := h.client.Do(req) if err != nil { return err } diff --git a/client_test.go b/client_test.go index d8cfe4e..f179563 100644 --- a/client_test.go +++ b/client_test.go @@ -251,6 +251,39 @@ func TestPrivilegeHandler_IsAllowed_Return_True_If_Privilege_Exists(t *testing.T assert.True(t, result) } +func TestPrivilegeHandler_Fetch_Sends_Authorization_Header_When_APIKey_Set(t *testing.T) { + var receivedAuth string + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + receivedAuth = r.Header.Get("Authorization") + _, _ = w.Write([]byte("{}")) + })) + defer server.Close() + + handler := New( + WithBaseURL(server.URL), + WithAPIKey("my-secret-key"), + ) + + err := handler.Fetch() + assert.NoError(t, err) + assert.Equal(t, "Bearer my-secret-key", receivedAuth) +} + +func TestPrivilegeHandler_Fetch_No_Authorization_Header_Without_APIKey(t *testing.T) { + var receivedAuth string + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + receivedAuth = r.Header.Get("Authorization") + _, _ = w.Write([]byte("{}")) + })) + defer server.Close() + + handler := New(WithBaseURL(server.URL)) + + err := handler.Fetch() + assert.NoError(t, err) + assert.Empty(t, receivedAuth) +} + func TestPrivilegeHandler_Fetch_Error_Response(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(500)