diff --git a/packages/passport/sdk/src/authManager.test.ts b/packages/passport/sdk/src/authManager.test.ts index 011acdc4dd..ec7b4b4c65 100644 --- a/packages/passport/sdk/src/authManager.test.ts +++ b/packages/passport/sdk/src/authManager.test.ts @@ -301,6 +301,28 @@ describe('AuthManager', () => { }); }); + describe('when the token contains a username', () => { + it('should extract username from the top level of the id token', async () => { + mockSigninPopup.mockResolvedValue(mockOidcUser); + (jwt_decode as jest.Mock).mockReturnValue({ + username: 'username123', + email: mockUser.profile.email, + nickname: mockUser.profile.nickname, + sub: mockUser.profile.sub, + }); + + const result = await authManager.login(); + + expect(result).toEqual({ + ...mockUser, + profile: { + ...mockUser.profile, + username: 'username123', + }, + }); + }); + }); + it('should throw the error if user is failed to login', async () => { mockSigninPopup.mockImplementation(() => { throw new Error(mockErrorMsg); diff --git a/packages/passport/sdk/src/authManager.ts b/packages/passport/sdk/src/authManager.ts index 17696d81ab..36128b4314 100644 --- a/packages/passport/sdk/src/authManager.ts +++ b/packages/passport/sdk/src/authManager.ts @@ -129,8 +129,13 @@ export default class AuthManager { private static mapOidcUserToDomainModel = (oidcUser: OidcUser): User => { let passport: PassportMetadata | undefined; + let username: string | undefined; if (oidcUser.id_token) { - passport = jwt_decode(oidcUser.id_token)?.passport; + const idTokenPayload = jwt_decode(oidcUser.id_token); + passport = idTokenPayload?.passport; + if (idTokenPayload?.username) { + username = idTokenPayload?.username; + } } const user: User = { @@ -142,6 +147,7 @@ export default class AuthManager { sub: oidcUser.profile.sub, email: oidcUser.profile.email, nickname: oidcUser.profile.nickname, + username, }, }; if (passport?.imx_eth_address) { @@ -163,7 +169,7 @@ export default class AuthManager { private static mapDeviceTokenResponseToOidcUser = (tokenResponse: DeviceTokenResponse): OidcUser => { const idTokenPayload: IdTokenPayload = jwt_decode(tokenResponse.id_token); - return new OidcUser({ + const oidcUser = new OidcUser({ id_token: tokenResponse.id_token, access_token: tokenResponse.access_token, refresh_token: tokenResponse.refresh_token, @@ -179,6 +185,12 @@ export default class AuthManager { passport: idTokenPayload.passport, }, }); + + const { username } = idTokenPayload; + if (username) { + oidcUser.profile.username = username; + } + return oidcUser; }; private buildExtraQueryParams( diff --git a/packages/passport/sdk/src/types.ts b/packages/passport/sdk/src/types.ts index 43c929def8..fcadf3a851 100644 --- a/packages/passport/sdk/src/types.ts +++ b/packages/passport/sdk/src/types.ts @@ -34,6 +34,7 @@ export type UserProfile = { email?: string; nickname?: string; sub: string; + username?: string; }; export enum RollupType { @@ -150,6 +151,7 @@ export type IdTokenPayload = { passport?: PassportMetadata; email: string; nickname: string; + username?: string; aud: string; sub: string; exp: number;