Skip to content

Commit 98010cb

Browse files
committed
changed as per reviewer comments
1 parent a14c231 commit 98010cb

File tree

4 files changed

+688
-558
lines changed

4 files changed

+688
-558
lines changed

packages-exp/auth-exp/src/core/user/additional_user_info.test.ts

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,12 @@ describe('core/user/additional_user_info', () => {
3838
providerId: ProviderId.FACEBOOK,
3939
rawUserInfo: rawUserInfoWithLogin
4040
});
41-
const additionalUserInfo = fromIdTokenResponse(idResponse)!;
42-
const { isNewUser, providerId, username, profile } = additionalUserInfo;
41+
const {
42+
isNewUser,
43+
providerId,
44+
username,
45+
profile
46+
} = fromIdTokenResponse(idResponse)!;
4347
expect(isNewUser).to.be.false;
4448
expect(providerId).to.eq(ProviderId.FACEBOOK);
4549
expect(username).to.be.null;
@@ -51,8 +55,12 @@ describe('core/user/additional_user_info', () => {
5155
providerId: ProviderId.GITHUB,
5256
rawUserInfo: rawUserInfoWithLogin
5357
});
54-
const additionalUserInfo = fromIdTokenResponse(idResponse)!;
55-
const { isNewUser, providerId, username, profile } = additionalUserInfo;
58+
const {
59+
isNewUser,
60+
providerId,
61+
username,
62+
profile
63+
} = fromIdTokenResponse(idResponse)!;
5664
expect(isNewUser).to.be.false;
5765
expect(providerId).to.eq(ProviderId.GITHUB);
5866
expect(username).to.eq('scott');
@@ -64,8 +72,12 @@ describe('core/user/additional_user_info', () => {
6472
providerId: ProviderId.GOOGLE,
6573
rawUserInfo: rawUserInfoWithLogin
6674
});
67-
const additionalUserInfo = fromIdTokenResponse(idResponse)!;
68-
const { isNewUser, providerId, username, profile } = additionalUserInfo;
75+
const {
76+
isNewUser,
77+
providerId,
78+
username,
79+
profile
80+
} = fromIdTokenResponse(idResponse)!;
6981
expect(isNewUser).to.be.false;
7082
expect(providerId).to.eq(ProviderId.GOOGLE);
7183
expect(username).to.be.null;
@@ -78,8 +90,12 @@ describe('core/user/additional_user_info', () => {
7890
rawUserInfo: rawUserInfoNoLogin,
7991
screenName: 'scott'
8092
});
81-
const additionalUserInfo = fromIdTokenResponse(idResponse)!;
82-
const { isNewUser, providerId, username, profile } = additionalUserInfo;
93+
const {
94+
isNewUser,
95+
providerId,
96+
username,
97+
profile
98+
} = fromIdTokenResponse(idResponse)!;
8399
expect(isNewUser).to.be.false;
84100
expect(providerId).to.eq(ProviderId.TWITTER);
85101
expect(username).to.eq('scott');
@@ -93,14 +109,14 @@ describe('core/user/additional_user_info', () => {
93109
providerId: ProviderId.FACEBOOK,
94110
rawUserInfo: rawUserInfoWithLogin
95111
});
96-
const additionalUserInfo = fromIdTokenResponse(idResponse)!;
97-
expect(additionalUserInfo.profile).to.eql(userProfileWithLogin);
112+
expect(fromIdTokenResponse(idResponse)!.profile).to.eql(
113+
userProfileWithLogin
114+
);
98115
});
99116

100117
it('for missing JSON', () => {
101118
const idResponse = idTokenResponse({ providerId: ProviderId.FACEBOOK });
102-
const additionalUserInfo = fromIdTokenResponse(idResponse)!;
103-
expect(additionalUserInfo.profile).to.be.empty;
119+
expect(fromIdTokenResponse(idResponse)!.profile).to.be.empty;
104120
});
105121
});
106122

@@ -110,23 +126,20 @@ describe('core/user/additional_user_info', () => {
110126
providerId: ProviderId.FACEBOOK,
111127
isNewUser: true
112128
});
113-
const additionalUserInfo = fromIdTokenResponse(idResponse)!;
114-
expect(additionalUserInfo.isNewUser).to.be.true;
129+
expect(fromIdTokenResponse(idResponse)!.isNewUser).to.be.true;
115130
});
116131

117132
it('for new users by toolkit response kind', () => {
118133
const idResponse = idTokenResponse({
119134
providerId: ProviderId.FACEBOOK,
120135
kind: IdTokenResponseKind.SignupNewUser
121136
});
122-
const additionalUserInfo = fromIdTokenResponse(idResponse)!;
123-
expect(additionalUserInfo.isNewUser).to.be.true;
137+
expect(fromIdTokenResponse(idResponse)!.isNewUser).to.be.true;
124138
});
125139

126140
it('for old users', () => {
127141
const idResponse = idTokenResponse({ providerId: ProviderId.FACEBOOK });
128-
const additionalUserInfo = fromIdTokenResponse(idResponse)!;
129-
expect(additionalUserInfo.isNewUser).to.be.false;
142+
expect(fromIdTokenResponse(idResponse)!.isNewUser).to.be.false;
130143
});
131144
});
132145

@@ -136,8 +149,12 @@ describe('core/user/additional_user_info', () => {
136149
providerId: ProviderId.CUSTOM,
137150
rawUserInfo: rawUserInfoWithLogin
138151
});
139-
const additionalUserInfo = fromIdTokenResponse(idResponse)!;
140-
const { isNewUser, providerId, username, profile } = additionalUserInfo;
152+
const {
153+
isNewUser,
154+
providerId,
155+
username,
156+
profile
157+
} = fromIdTokenResponse(idResponse)!;
141158
expect(isNewUser).to.be.false;
142159
expect(providerId).to.be.null;
143160
expect(username).to.be.null;
@@ -149,17 +166,27 @@ describe('core/user/additional_user_info', () => {
149166
providerId: ProviderId.ANONYMOUS,
150167
rawUserInfo: rawUserInfoWithLogin
151168
});
152-
const additionalUserInfo = fromIdTokenResponse(idResponse)!;
153-
const { isNewUser, providerId, username, profile } = additionalUserInfo;
169+
const {
170+
isNewUser,
171+
providerId,
172+
username,
173+
profile
174+
} = fromIdTokenResponse(idResponse)!;
154175
expect(isNewUser).to.be.false;
155176
expect(providerId).to.be.null;
156177
expect(username).to.be.null;
157178
expect(profile).to.eq(profile);
158179
});
159180

160181
it('for missing provider IDs in response but not in token', () => {
161-
const additionalUserInfo = fromIdTokenResponse(idTokenResponse({rawUserInfo: rawUserInfoWithLogin}))!;
162-
const {isNewUser, providerId, username, profile} = additionalUserInfo;
182+
const {
183+
isNewUser,
184+
providerId,
185+
username,
186+
profile
187+
} = fromIdTokenResponse(
188+
idTokenResponse({ rawUserInfo: rawUserInfoWithLogin })
189+
)!;
163190
expect(isNewUser).to.be.false;
164191
expect(providerId).to.eq(ProviderId.FACEBOOK);
165192
expect(username).to.be.null;
@@ -170,8 +197,7 @@ describe('core/user/additional_user_info', () => {
170197
describe('returns null', () => {
171198
it('for missing provider IDs', () => {
172199
const idResponse = idTokenResponse({});
173-
const additionalUserInfo = fromIdTokenResponse(idResponse);
174-
expect(additionalUserInfo).to.be.null;
200+
expect(fromIdTokenResponse(idResponse)!).to.be.null;
175201
});
176202
});
177203
});

packages-exp/auth-exp/src/core/user/additional_user_info.ts

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,45 @@
1414
* See the License for the specific language governing permissions and
1515
* limitations under the License.
1616
*/
17-
import { AdditionalUserInfo, UserProfile } from '../../model/user';
17+
import {
18+
AdditionalUserInfo,
19+
UserProfile,
20+
ProviderId
21+
} from '@firebase/auth-types-exp';
1822
import { IdTokenResponse, IdTokenResponseKind } from '../../model/id_token';
19-
import { ProviderId } from '../providers';
20-
import { parseToken } from './id_token_result';
23+
import { _parseToken } from './id_token_result';
24+
import { assert } from '../util/assert';
2125

26+
/**
27+
* Parse the `AdditionalUserInfo` from the ID token response.
28+
*/
2229
export function fromIdTokenResponse(
2330
idTokenResponse: IdTokenResponse,
31+
appName: string
2432
): AdditionalUserInfo | null {
2533
const { providerId } = idTokenResponse;
26-
const profile =
27-
typeof idTokenResponse.rawUserInfo === 'string'
28-
? JSON.parse(idTokenResponse.rawUserInfo)
29-
: {};
34+
const profile = idTokenResponse.rawUserInfo
35+
? JSON.parse(idTokenResponse.rawUserInfo)
36+
: {};
3037
const isNewUser =
3138
!!idTokenResponse.isNewUser ||
3239
idTokenResponse.kind === IdTokenResponseKind.SignupNewUser;
3340
if (!providerId && !!idTokenResponse) {
34-
const providerId = parseToken(idTokenResponse.idToken)?.firebase?.['sign_in_provider'] as ProviderId;
35-
if (providerId && Object.values(ProviderId).includes(providerId)) {
36-
return new GenericAdditionalUserInfo(isNewUser, providerId, null, profile);
41+
const providerId = _parseToken(idTokenResponse.idToken)?.firebase?.[
42+
'sign_in_provider'
43+
];
44+
assert(
45+
// @ts-ignore - Check to see if string is castable to enum.
46+
!providerId || Object.values(ProviderId).includes(providerId),
47+
appName
48+
);
49+
if (providerId) {
50+
const filteredProviderId =
51+
providerId !== ProviderId.ANONYMOUS && providerId !== ProviderId.CUSTOM
52+
? (providerId as ProviderId)
53+
: null;
54+
// Uses generic class in accordance with the legacy SDK.
55+
return new GenericAdditionalUserInfo(isNewUser, filteredProviderId, null);
3756
}
3857
}
3958
if (!providerId) {
@@ -54,9 +73,9 @@ export function fromIdTokenResponse(
5473
);
5574
case ProviderId.CUSTOM:
5675
case ProviderId.ANONYMOUS:
57-
return new GenericAdditionalUserInfo(isNewUser, null, null, profile);
76+
return new GenericAdditionalUserInfo(isNewUser, null, null);
5877
default:
59-
return new GenericAdditionalUserInfo(
78+
return new FederatedAdditionalUserInfo(
6079
isNewUser,
6180
providerId,
6281
null,
@@ -69,18 +88,28 @@ class GenericAdditionalUserInfo implements AdditionalUserInfo {
6988
constructor(
7089
readonly isNewUser: boolean,
7190
readonly providerId: ProviderId | null,
72-
readonly username: string | null,
73-
readonly profile: UserProfile
91+
readonly username: string | null
7492
) {}
7593
}
7694

77-
class FacebookAdditionalUserInfo extends GenericAdditionalUserInfo {
95+
class FederatedAdditionalUserInfo extends GenericAdditionalUserInfo {
96+
constructor(
97+
isNewUser: boolean,
98+
providerId: ProviderId | null,
99+
username: string | null,
100+
readonly profile: UserProfile
101+
) {
102+
super(isNewUser, providerId, username);
103+
}
104+
}
105+
106+
class FacebookAdditionalUserInfo extends FederatedAdditionalUserInfo {
78107
constructor(isNewUser: boolean, profile: UserProfile) {
79108
super(isNewUser, ProviderId.FACEBOOK, null, profile);
80109
}
81110
}
82111

83-
class GithubAdditionalUserInfo extends GenericAdditionalUserInfo {
112+
class GithubAdditionalUserInfo extends FederatedAdditionalUserInfo {
84113
constructor(isNewUser: boolean, profile: UserProfile) {
85114
super(
86115
isNewUser,
@@ -91,13 +120,13 @@ class GithubAdditionalUserInfo extends GenericAdditionalUserInfo {
91120
}
92121
}
93122

94-
class GoogleAdditionalUserInfo extends GenericAdditionalUserInfo {
123+
class GoogleAdditionalUserInfo extends FederatedAdditionalUserInfo {
95124
constructor(isNewUser: boolean, profile: UserProfile) {
96125
super(isNewUser, ProviderId.GOOGLE, null, profile);
97126
}
98127
}
99128

100-
class TwitterAdditionalUserInfo extends GenericAdditionalUserInfo {
129+
class TwitterAdditionalUserInfo extends FederatedAdditionalUserInfo {
101130
constructor(
102131
isNewUser: boolean,
103132
profile: UserProfile,

packages-exp/auth-types-exp/index.d.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,3 +411,18 @@ export interface UserMetadata {
411411
readonly creationTime?: string;
412412
readonly lastSignInTime?: string;
413413
}
414+
415+
/**
416+
* Additional user information.
417+
*/
418+
export interface AdditionalUserInfo {
419+
readonly isNewUser: boolean;
420+
readonly profile?: UserProfile;
421+
readonly providerId: ProviderId | null;
422+
readonly username: string | null;
423+
}
424+
425+
/**
426+
* User profile used in `AdditionalUserInfo`
427+
*/
428+
export type UserProfile = { [key: string]: unknown } | null;

0 commit comments

Comments
 (0)