Skip to content

Commit d4e1494

Browse files
committed
Fix issue with IDP sign in error handling
1 parent 38caaad commit d4e1494

File tree

5 files changed

+35
-6
lines changed

5 files changed

+35
-6
lines changed

packages-exp/auth-exp/src/api/authentication/idp.ts

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export interface SignInWithIdpRequest {
2525
sessionId?: string;
2626
tenantId?: string;
2727
returnSecureToken: boolean;
28+
returnIdpCredential?: boolean;
2829
idToken?: IdToken;
2930
autoCreate?: boolean;
3031
pendingToken?: string;

packages-exp/auth-exp/src/api/index.test.ts

+23
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,29 @@ describe('api/_performApiRequest', () => {
120120
expect(mock.calls[0].request).to.eql(request);
121121
});
122122

123+
it('should translate server success with errorMessage into auth error', async () => {
124+
const response = {
125+
errorMessage: ServerError.FEDERATED_USER_ID_ALREADY_LINKED,
126+
idToken: 'foo-bar',
127+
};
128+
const mock = mockEndpoint(
129+
Endpoint.SIGN_IN_WITH_IDP,
130+
response,
131+
200
132+
);
133+
const promise = _performApiRequest<typeof request, typeof serverResponse>(
134+
auth,
135+
HttpMethod.POST,
136+
Endpoint.SIGN_IN_WITH_IDP,
137+
request
138+
);
139+
await expect(promise).to.be.rejectedWith(
140+
FirebaseError,
141+
'auth/credential-already-in-use'
142+
).eventually.with.deep.property('customData', {appName: 'test-app', _tokenResponse: response});
143+
expect(mock.calls[0].request).to.eql(request);
144+
});
145+
123146
it('should translate complex server errors to auth errors', async () => {
124147
const mock = mockEndpoint(
125148
Endpoint.SIGN_UP,

packages-exp/auth-exp/src/api/index.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,11 @@ export async function _performFetchWithErrorHandling<V>(
132132
throw makeTaggedError(auth, AuthErrorCode.NEED_CONFIRMATION, json);
133133
}
134134

135-
if (response.ok) {
135+
if (response.ok && !('errorMessage' in json)) {
136136
return json;
137137
} else {
138-
const serverErrorCode = json.error.message.split(' : ')[0] as ServerError;
138+
const errorMessage = response.ok ? json.errorMessage : json.error.message;
139+
const serverErrorCode = errorMessage.split(' : ')[0] as ServerError;
139140
if (serverErrorCode === ServerError.FEDERATED_USER_ID_ALREADY_LINKED) {
140141
throw makeTaggedError(
141142
auth,

packages-exp/auth-exp/src/core/strategies/idp.test.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ describe('core/strategies/idb', () => {
8282
postBody: 'post-body',
8383
tenantId: 'tenant-id',
8484
pendingToken: 'pending-token',
85-
returnSecureToken: true
85+
returnSecureToken: true,
86+
returnIdpCredential: true,
8687
});
8788
});
8889

@@ -112,7 +113,7 @@ describe('core/strategies/idb', () => {
112113
tenantId: 'tenant-id',
113114
pendingToken: 'pending-token',
114115
postBody: 'post-body',
115-
bypassAuthState: true
116+
bypassAuthState: true,
116117
});
117118
expect(stub.getCall(0).lastArg).to.be.true;
118119
});
@@ -136,7 +137,8 @@ describe('core/strategies/idb', () => {
136137
postBody: 'post-body',
137138
tenantId: 'tenant-id',
138139
pendingToken: 'pending-token',
139-
returnSecureToken: true
140+
returnSecureToken: true,
141+
returnIdpCredential: true,
140142
});
141143
});
142144

@@ -193,6 +195,7 @@ describe('core/strategies/idb', () => {
193195
tenantId: 'tenant-id',
194196
pendingToken: 'pending-token',
195197
returnSecureToken: true,
198+
returnIdpCredential: true,
196199
idToken: idTokenBeforeLink
197200
});
198201
});

packages-exp/auth-exp/src/core/strategies/idp.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ class IdpCredential extends AuthCredential {
7171
postBody: this.params.postBody || null,
7272
tenantId: this.params.tenantId,
7373
pendingToken: this.params.pendingToken,
74-
returnSecureToken: true
74+
returnSecureToken: true,
75+
returnIdpCredential: true,
7576
};
7677

7778
if (idToken) {

0 commit comments

Comments
 (0)