Skip to content

Commit 4e64ee6

Browse files
authored
fix: user setup uses org token on provision (#495)
1 parent 9a4a808 commit 4e64ee6

5 files changed

Lines changed: 23 additions & 9 deletions

File tree

src/api/ci-token.client.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export type IamAccessOrgTokensInput =
1717

1818
export interface ProvisionCITokenResponse {
1919
refresh_token: string;
20+
access_token: string;
2021
}
2122

2223
export interface ProvisionCITokenOptions {
@@ -139,5 +140,5 @@ export async function provisionCIToken(options: ProvisionCITokenOptions = {}): P
139140
throw new Error('Either orgId or previousToken is required to provision a CI token');
140141
}
141142
const result = await getOrgAccessTokens(input);
142-
return { refresh_token: result.refreshToken };
143+
return { access_token: result.accessToken, refresh_token: result.refreshToken };
143144
}

src/api/user-setup.client.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ function extractErrorCode(errors: ReadonlyArray<GraphQLFormattedError>): ApiErro
3535
return code;
3636
}
3737

38-
export async function getUserSetupStatus(options?: { preferOAuth?: boolean }): Promise<{
38+
export async function getUserSetupStatus(options?: { preferOAuth?: boolean; orgAccessToken?: string }): Promise<{
3939
isComplete: boolean;
4040
orgId?: number | null;
4141
}> {
42-
const tokenProvider = getTokenProvider(options?.preferOAuth);
42+
const tokenProvider = getTokenProvider(options?.preferOAuth, options?.orgAccessToken);
4343
const client = createApollo(getGraphqlUrl(), tokenProvider);
4444
const res = await client.query<UserSetupStatusResponse>({ query: userSetupStatusQuery });
4545

@@ -70,11 +70,11 @@ export async function getUserSetupStatus(options?: { preferOAuth?: boolean }): P
7070
return { isComplete: status.isComplete, orgId: status.orgId ?? undefined };
7171
}
7272

73-
export async function completeUserSetup(options?: { preferOAuth?: boolean }): Promise<{
73+
export async function completeUserSetup(options?: { preferOAuth?: boolean; orgAccessToken?: string }): Promise<{
7474
isComplete: boolean;
7575
orgId?: number | null;
7676
}> {
77-
const tokenProvider = getTokenProvider(options?.preferOAuth);
77+
const tokenProvider = getTokenProvider(options?.preferOAuth, options?.orgAccessToken);
7878
const client = createApollo(getGraphqlUrl(), tokenProvider);
7979
const res = await client.mutate<CompleteUserSetupResponse>({ mutation: completeUserSetupMutation });
8080

@@ -105,7 +105,7 @@ export async function completeUserSetup(options?: { preferOAuth?: boolean }): Pr
105105
return { isComplete: true, orgId: result.orgId ?? undefined };
106106
}
107107

108-
export async function ensureUserSetup(options?: { preferOAuth?: boolean }): Promise<number> {
108+
export async function ensureUserSetup(options?: { preferOAuth?: boolean; orgAccessToken?: string }): Promise<number> {
109109
const status = await withRetries('user-setup-status', () => getUserSetupStatus(options), {
110110
attempts: USER_SETUP_MAX_ATTEMPTS,
111111
baseDelayMs: USER_SETUP_RETRY_DELAY_MS,

src/commands/auth/provision-ci-token.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,15 @@ export default class AuthProvisionCiToken extends Command {
4545

4646
try {
4747
const result = await provisionCIToken({ orgId });
48+
try {
49+
await ensureUserSetup({ orgAccessToken: result.access_token });
50+
} catch (error) {
51+
track('CLI CI Token Provision Failed', () => ({
52+
command: 'auth provision-ci-token',
53+
error: `user_setup_failed:${getErrorMessage(error)}`,
54+
}));
55+
this.error(`User Org setup failed. ${getErrorMessage(error)}`);
56+
}
4857
const refreshToken = result.refresh_token;
4958
saveCIToken(refreshToken);
5059
this.log('CI token provisioned and saved locally.');

src/service/auth.svc.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ export const AUTH_ERROR_MESSAGES = {
2424

2525
export async function getTokenForScanWithSource(
2626
preferOAuth?: boolean,
27+
orgAccessToken?: string,
2728
): Promise<{ token: string; source: TokenSource }> {
29+
if (orgAccessToken) {
30+
return { token: orgAccessToken, source: 'ci' };
31+
}
2832
if (preferOAuth) {
2933
const token = await requireAccessToken();
3034
return { token, source: 'oauth' };
@@ -94,9 +98,9 @@ export async function getAccessToken(): Promise<string | undefined> {
9498
return refreshed.access_token;
9599
}
96100

97-
export function getTokenProvider(preferOAuth?: boolean): TokenProvider {
101+
export function getTokenProvider(preferOAuth?: boolean, orgAccessToken?: string): TokenProvider {
98102
return async (_forceRefresh?: boolean): Promise<string> => {
99-
const { token } = await getTokenForScanWithSource(preferOAuth);
103+
const { token } = await getTokenForScanWithSource(preferOAuth, orgAccessToken);
100104
return token;
101105
};
102106
}

test/api/ci-token.client.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ describe('ci-token.client', () => {
107107
);
108108

109109
const result = await provisionCIToken({ orgId: 42 });
110-
expect(result).toEqual({ refresh_token: 'ci-refresh-token-123' });
110+
expect(result).toEqual({ refresh_token: 'ci-refresh-token-123', access_token: 'new-access' });
111111

112112
const calls = fetchMock.getCalls();
113113
expect(calls).toHaveLength(1);

0 commit comments

Comments
 (0)