Skip to content

Commit 8249f83

Browse files
authored
feat(passport): Make username available in userInfo (#2748)
1 parent 2f409fc commit 8249f83

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

packages/passport/sdk/src/authManager.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,28 @@ describe('AuthManager', () => {
301301
});
302302
});
303303

304+
describe('when the token contains a username', () => {
305+
it('should extract username from the top level of the id token', async () => {
306+
mockSigninPopup.mockResolvedValue(mockOidcUser);
307+
(jwt_decode as jest.Mock).mockReturnValue({
308+
username: 'username123',
309+
email: mockUser.profile.email,
310+
nickname: mockUser.profile.nickname,
311+
sub: mockUser.profile.sub,
312+
});
313+
314+
const result = await authManager.login();
315+
316+
expect(result).toEqual({
317+
...mockUser,
318+
profile: {
319+
...mockUser.profile,
320+
username: 'username123',
321+
},
322+
});
323+
});
324+
});
325+
304326
it('should throw the error if user is failed to login', async () => {
305327
mockSigninPopup.mockImplementation(() => {
306328
throw new Error(mockErrorMsg);

packages/passport/sdk/src/authManager.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,13 @@ export default class AuthManager {
129129

130130
private static mapOidcUserToDomainModel = (oidcUser: OidcUser): User => {
131131
let passport: PassportMetadata | undefined;
132+
let username: string | undefined;
132133
if (oidcUser.id_token) {
133-
passport = jwt_decode<IdTokenPayload>(oidcUser.id_token)?.passport;
134+
const idTokenPayload = jwt_decode<IdTokenPayload>(oidcUser.id_token);
135+
passport = idTokenPayload?.passport;
136+
if (idTokenPayload?.username) {
137+
username = idTokenPayload?.username;
138+
}
134139
}
135140

136141
const user: User = {
@@ -142,6 +147,7 @@ export default class AuthManager {
142147
sub: oidcUser.profile.sub,
143148
email: oidcUser.profile.email,
144149
nickname: oidcUser.profile.nickname,
150+
username,
145151
},
146152
};
147153
if (passport?.imx_eth_address) {
@@ -163,7 +169,7 @@ export default class AuthManager {
163169
private static mapDeviceTokenResponseToOidcUser = (tokenResponse: DeviceTokenResponse): OidcUser => {
164170
const idTokenPayload: IdTokenPayload = jwt_decode(tokenResponse.id_token);
165171

166-
return new OidcUser({
172+
const oidcUser = new OidcUser({
167173
id_token: tokenResponse.id_token,
168174
access_token: tokenResponse.access_token,
169175
refresh_token: tokenResponse.refresh_token,
@@ -179,6 +185,12 @@ export default class AuthManager {
179185
passport: idTokenPayload.passport,
180186
},
181187
});
188+
189+
const { username } = idTokenPayload;
190+
if (username) {
191+
oidcUser.profile.username = username;
192+
}
193+
return oidcUser;
182194
};
183195

184196
private buildExtraQueryParams(

packages/passport/sdk/src/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export type UserProfile = {
3434
email?: string;
3535
nickname?: string;
3636
sub: string;
37+
username?: string;
3738
};
3839

3940
export enum RollupType {
@@ -150,6 +151,7 @@ export type IdTokenPayload = {
150151
passport?: PassportMetadata;
151152
email: string;
152153
nickname: string;
154+
username?: string;
153155
aud: string;
154156
sub: string;
155157
exp: number;

0 commit comments

Comments
 (0)