Skip to content

Commit bf70ed2

Browse files
authored
feat: Add a Token struct to allow the CLI to differentiate between Bearer and APIKey tokens (#66)
This PR adds a `Token` struct to allow the CLI to differentiate between the auth methods. The CLI will have a different download flow depending on if the auth is using a bearer token vs an API key. For the bearer token the `team_name` is configured using the `cloudquery switch` command. For the API key, the key is associated with a team name already.
1 parent 46a8d27 commit bf70ed2

File tree

2 files changed

+29
-14
lines changed

2 files changed

+29
-14
lines changed

auth/token.go

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,21 @@ type tokenResponse struct {
2929
ProjectID string `json:"project_id"`
3030
}
3131

32+
type TokenType int
33+
34+
const (
35+
Undefined TokenType = iota
36+
BearerToken
37+
APIKey
38+
)
39+
40+
var UndefinedToken = Token{Type: Undefined, Value: ""}
41+
42+
type Token struct {
43+
Type TokenType
44+
Value string
45+
}
46+
3247
type TokenClient struct {
3348
url string
3449
apiKey string
@@ -45,37 +60,37 @@ func NewTokenClient() *TokenClient {
4560

4661
// GetToken returns the ID token
4762
// If CLOUDQUERY_API_KEY is set, it returns that value, otherwise it returns an ID token generated from the refresh token.
48-
func (tc *TokenClient) GetToken() (string, error) {
63+
func (tc *TokenClient) GetToken() (Token, error) {
4964
if token := os.Getenv(EnvVarCloudQueryAPIKey); token != "" {
50-
return token, nil
65+
return Token{Type: APIKey, Value: token}, nil
5166
}
5267

5368
// If the token is not expired, return it
5469
if !tc.expiresAt.IsZero() && tc.expiresAt.Sub(time.Now().UTC()) > ExpiryBuffer {
55-
return tc.idToken, nil
70+
return Token{Type: BearerToken, Value: tc.idToken}, nil
5671
}
5772

5873
refreshToken, err := ReadRefreshToken()
5974
if err != nil {
60-
return "", fmt.Errorf("failed to read refresh token: %w. Hint: You may need to run `cloudquery login` or set %s", err, EnvVarCloudQueryAPIKey)
75+
return UndefinedToken, fmt.Errorf("failed to read refresh token: %w. Hint: You may need to run `cloudquery login` or set %s", err, EnvVarCloudQueryAPIKey)
6176
}
6277
if refreshToken == "" {
63-
return "", fmt.Errorf("authentication token not found. Hint: You may need to run `cloudquery login` or set %s", EnvVarCloudQueryAPIKey)
78+
return UndefinedToken, fmt.Errorf("authentication token not found. Hint: You may need to run `cloudquery login` or set %s", EnvVarCloudQueryAPIKey)
6479
}
6580
tokenResponse, err := tc.generateToken(refreshToken)
6681
if err != nil {
67-
return "", fmt.Errorf("failed to sign in with custom token: %w", err)
82+
return UndefinedToken, fmt.Errorf("failed to sign in with custom token: %w", err)
6883
}
6984

7085
if err := SaveRefreshToken(tokenResponse.RefreshToken); err != nil {
71-
return "", fmt.Errorf("failed to save refresh token: %w", err)
86+
return UndefinedToken, fmt.Errorf("failed to save refresh token: %w", err)
7287
}
7388

7489
if err := tc.updateIDToken(tokenResponse); err != nil {
75-
return "", fmt.Errorf("failed to update ID token: %w", err)
90+
return UndefinedToken, fmt.Errorf("failed to update ID token: %w", err)
7691
}
7792

78-
return tc.idToken, nil
93+
return Token{Type: BearerToken, Value: tc.idToken}, nil
7994
}
8095

8196
func (tc *TokenClient) generateToken(refreshToken string) (*tokenResponse, error) {

auth/token_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func TestTokenClient_EnvironmentVariable(t *testing.T) {
4646
token, err := NewTokenClient().GetToken()
4747
require.NoError(t, err)
4848

49-
require.Equal(t, "my_token", token)
49+
require.Equal(t, Token{Type: APIKey, Value: "my_token"}, token)
5050
}
5151

5252
func TestTokenClient_GetToken_ShortExpiry(t *testing.T) {
@@ -66,13 +66,13 @@ func TestTokenClient_GetToken_ShortExpiry(t *testing.T) {
6666

6767
token, err := tc.GetToken()
6868
require.NoError(t, err)
69-
require.Equal(t, "my_id_token_0", token, "first token")
69+
require.Equal(t, Token{Type: BearerToken, Value: "my_id_token_0"}, token, "first token")
7070

7171
tc.expiresAt = t0
7272

7373
token, err = tc.GetToken()
7474
require.NoError(t, err)
75-
require.Equal(t, "my_id_token_1", token, "expected to issue new token")
75+
require.Equal(t, Token{Type: BearerToken, Value: "my_id_token_1"}, token, "expected to issue new token")
7676
}
7777

7878
func TestTokenClient_GetToken_LongExpiry(t *testing.T) {
@@ -89,11 +89,11 @@ func TestTokenClient_GetToken_LongExpiry(t *testing.T) {
8989

9090
token, err := tc.GetToken()
9191
require.NoError(t, err)
92-
require.Equal(t, "my_id_token_0", token, "first token")
92+
require.Equal(t, Token{Type: BearerToken, Value: "my_id_token_0"}, token, "first token")
9393

9494
token, err = tc.GetToken()
9595
require.NoError(t, err)
96-
require.Equal(t, "my_id_token_0", token, "expected to reuse token")
96+
require.Equal(t, Token{Type: BearerToken, Value: "my_id_token_0"}, token, "expected to reuse token")
9797
}
9898

9999
func overrideEnvironmentVariable(t *testing.T, key, value string) func() {

0 commit comments

Comments
 (0)