Skip to content

Commit 12bc1ed

Browse files
Merge pull request #6477 from Shopify/preserve-session-alias-on-refresh
Preserve session alias on refresh
2 parents 91cd896 + 7fad402 commit 12bc1ed

File tree

3 files changed

+41
-2
lines changed

3 files changed

+41
-2
lines changed

.changeset/tasty-boxes-hunt.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@shopify/cli-kit': patch
3+
---
4+
5+
Preserve session alias on token refresh

packages/cli-kit/src/private/node/session/exchange.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,35 @@ describe('refresh access tokens', () => {
205205
// Then
206206
return expect(got).rejects.toThrowError(AbortError)
207207
})
208+
209+
test('preserves the alias when refreshing access token', async () => {
210+
// Given
211+
const tokenWithAlias: IdentityToken = {
212+
...identityToken,
213+
alias: 'my-custom-alias',
214+
}
215+
const refreshData = {
216+
access_token: 'new_access_token',
217+
refresh_token: 'new_refresh_token',
218+
scope: 'new_scope',
219+
expires_in: 7200,
220+
id_token: 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI1Njc4LTEyMzQifQ.2OGPUmd5MTEv-J5p3Ra4mskCN0635qN8lh3p5_BcoYY',
221+
}
222+
const response = new Response(JSON.stringify(refreshData))
223+
vi.mocked(shopifyFetch).mockResolvedValue(response)
224+
225+
// When
226+
const result = await refreshAccessToken(tokenWithAlias)
227+
228+
// Then
229+
expect(result.accessToken).toBe('new_access_token')
230+
expect(result.refreshToken).toBe('new_refresh_token')
231+
expect(result.scopes).toEqual(['new_scope'])
232+
// Original userId is preserved
233+
expect(result.userId).toBe('1234-5678')
234+
// Alias is preserved
235+
expect(result.alias).toBe('my-custom-alias')
236+
})
208237
})
209238

210239
const tokenExchangeMethods = [

packages/cli-kit/src/private/node/session/exchange.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export async function refreshAccessToken(currentToken: IdentityToken): Promise<I
6565
}
6666
const tokenResult = await tokenRequest(params)
6767
const value = tokenResult.mapError(tokenRequestErrorHandler).valueOrBug()
68-
return buildIdentityToken(value, currentToken.userId)
68+
return buildIdentityToken(value, currentToken.userId, currentToken.alias)
6969
}
7070

7171
/**
@@ -237,7 +237,11 @@ async function tokenRequest(params: {
237237
return err({error: payload.error, store: params.store})
238238
}
239239

240-
function buildIdentityToken(result: TokenRequestResult, existingUserId?: string): IdentityToken {
240+
function buildIdentityToken(
241+
result: TokenRequestResult,
242+
existingUserId?: string,
243+
existingAlias?: string,
244+
): IdentityToken {
241245
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
242246
const userId = existingUserId ?? (result.id_token ? jose.decodeJwt(result.id_token).sub! : undefined)
243247

@@ -251,6 +255,7 @@ function buildIdentityToken(result: TokenRequestResult, existingUserId?: string)
251255
expiresAt: new Date(Date.now() + result.expires_in * 1000),
252256
scopes: result.scope.split(' '),
253257
userId,
258+
alias: existingAlias,
254259
}
255260
}
256261

0 commit comments

Comments
 (0)