Files
threshold/internal/tests/api/authmethods/authenticate_test.go
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

100 lines
4.1 KiB
Go
Raw Normal View History

// Copyright (c) HashiCorp, Inc.
2021-04-08 20:54:32 -04:00
// SPDX-License-Identifier: MPL-2.0
2023-02-02 17:15:17 -08:00
package authmethods_test
import (
2021-04-08 20:54:32 -04:00
"encoding/json"
2021-03-24 16:07:43 -04:00
"fmt"
"net/http"
"os"
"sync"
"testing"
2020-09-24 14:34:58 -07:00
"github.com/hashicorp/boundary/api"
2020-08-10 17:15:02 -04:00
"github.com/hashicorp/boundary/api/authmethods"
2021-03-24 16:07:43 -04:00
"github.com/hashicorp/boundary/api/authtokens"
"github.com/hashicorp/boundary/internal/cmd/config"
"github.com/hashicorp/boundary/internal/daemon/controller"
"github.com/hashicorp/boundary/internal/observability/event"
tests_api "github.com/hashicorp/boundary/internal/tests/api"
"github.com/hashicorp/go-hclog"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// TestAuthenticate tests the api calls and the audit events it should produce
func TestAuthenticate(t *testing.T) {
assert, require := assert.New(t), require.New(t)
eventConfig := event.TestEventerConfig(t, "TestAuthenticateAuditEntry", event.TestWithAuditSink(t))
testLock := &sync.Mutex{}
testLogger := hclog.New(&hclog.LoggerOptions{
Mutex: testLock,
Name: "test",
})
require.NoError(event.InitSysEventer(testLogger, testLock, "TestAuthenticateAuditEntry", event.WithEventerConfig(&eventConfig.EventerConfig)))
tcConfig, err := config.DevController()
require.NoError(err)
tcConfig.Eventing = &eventConfig.EventerConfig
tc := controller.NewTestController(t, &controller.TestControllerOpts{Config: tcConfig})
defer tc.Shutdown()
client := tc.Client()
methods := authmethods.NewClient(client)
2022-10-25 18:29:38 -05:00
tok, err := methods.Authenticate(tc.Context(), tc.Server().DevPasswordAuthMethodId, "login", map[string]any{"login_name": "user", "password": "passpass"})
require.NoError(err)
assert.NotNil(tok)
2022-10-25 18:29:38 -05:00
_, err = methods.Authenticate(tc.Context(), tc.Server().DevPasswordAuthMethodId, "login", map[string]any{"login_name": "user", "password": "wrong"})
2020-09-24 14:34:58 -07:00
require.Error(err)
apiErr := api.AsServerError(err)
require.NotNil(apiErr)
2021-02-25 12:43:17 -05:00
assert.EqualValuesf(http.StatusUnauthorized, apiErr.Response().StatusCode(), "Expected unauthorized, got %q", apiErr.Message)
2021-03-24 16:07:43 -04:00
// Also ensure that, for now, using "credentials" still works, as well as no command.
2022-10-25 18:29:38 -05:00
reqBody := map[string]any{
"attributes": map[string]any{"login_name": "user", "password": "passpass"},
2021-03-24 16:07:43 -04:00
}
2021-04-08 20:54:32 -04:00
req, err := client.NewRequest(tc.Context(), "POST", fmt.Sprintf("auth-methods/%s:authenticate", tc.Server().DevPasswordAuthMethodId), reqBody)
2021-03-24 16:07:43 -04:00
require.NoError(err)
resp, err := client.Do(req)
require.NoError(err)
2021-04-08 20:54:32 -04:00
result := new(authmethods.AuthenticateResult)
apiErr, err = resp.Decode(result)
2021-03-24 16:07:43 -04:00
require.NoError(err)
require.Nil(apiErr)
2021-04-08 20:54:32 -04:00
token := new(authtokens.AuthToken)
require.NoError(json.Unmarshal(result.GetRawAttributes(), token))
require.NotEmpty(token.Token)
require.NotNil(eventConfig.AuditEvents)
_ = os.WriteFile(eventConfig.AuditEvents.Name(), nil, 0o666) // clean out audit events from previous calls
2022-10-25 18:29:38 -05:00
tok, err = methods.Authenticate(tc.Context(), tc.Server().DevPasswordAuthMethodId, "login", map[string]any{"login_name": "user", "password": "passpass"})
require.NoError(err)
assert.NotNil(tok)
got := tests_api.CloudEventFromFile(t, eventConfig.AuditEvents.Name())
// All attribute fields are classified for now.
reqDetails := tests_api.GetEventDetails(t, got, "request")
tests_api.AssertRedactedValues(t, reqDetails)
2022-10-25 18:29:38 -05:00
tests_api.AssertRedactedValues(t, reqDetails["Attrs"].(map[string]any)["PasswordLoginAttributes"], "password", "login_name")
respDetails := tests_api.GetEventDetails(t, got, "response")
tests_api.AssertRedactedValues(t, respDetails)
2022-10-25 18:29:38 -05:00
tests_api.AssertRedactedValues(t, respDetails["Attrs"].(map[string]any)["AuthTokenResponse"], "token")
_ = os.WriteFile(eventConfig.AuditEvents.Name(), nil, 0o666) // clean out audit events from previous calls
2022-10-25 18:29:38 -05:00
tok, err = methods.Authenticate(tc.Context(), tc.Server().DevPasswordAuthMethodId, "login", map[string]any{"login_name": "user", "password": "bad-pass"})
require.Error(err)
assert.Nil(tok)
got = tests_api.CloudEventFromFile(t, eventConfig.AuditEvents.Name())
reqDetails = tests_api.GetEventDetails(t, got, "request")
tests_api.AssertRedactedValues(t, reqDetails)
2022-10-25 18:29:38 -05:00
tests_api.AssertRedactedValues(t, reqDetails["Attrs"].(map[string]any)["PasswordLoginAttributes"], "password", "login_name")
}