Skip to content

Commit 895e887

Browse files
committed
Refactor the way UserCredentials work in anticipation of mudularization
1 parent e2efd27 commit 895e887

20 files changed

+190
-255
lines changed

packages-exp/auth-exp/src/core/credentials/from_token_response.test.ts

Lines changed: 0 additions & 43 deletions
This file was deleted.

packages-exp/auth-exp/src/core/credentials/from_token_response.ts

Lines changed: 0 additions & 36 deletions
This file was deleted.

packages-exp/auth-exp/src/core/providers/phone.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,18 @@
1616
*/
1717

1818
import * as externs from '@firebase/auth-types-exp';
19-
2019
// eslint-disable-next-line import/no-extraneous-dependencies
2120
import { FirebaseError } from '@firebase/util';
21+
22+
import { SignInWithPhoneNumberResponse } from '../../api/authentication/sms';
23+
import { ApplicationVerifier } from '../../model/application_verifier';
2224
import { Auth } from '../../model/auth';
25+
import { UserCredential } from '../../model/user';
2326
import { initializeAuth } from '../auth/auth_impl';
2427
import { PhoneAuthCredential } from '../credentials/phone';
28+
import { AuthErrorCode } from '../errors';
2529
import { _verifyPhoneNumber } from '../strategies/phone';
26-
import { debugFail } from '../util/assert';
27-
import { ApplicationVerifier } from '../../model/application_verifier';
30+
import { assert, debugFail, fail } from '../util/assert';
2831

2932
export class PhoneAuthProvider implements externs.PhoneAuthProvider {
3033
static readonly PROVIDER_ID = externs.ProviderId.PHONE;
@@ -58,11 +61,20 @@ export class PhoneAuthProvider implements externs.PhoneAuthProvider {
5861
);
5962
}
6063

61-
static _credentialFromResult(
64+
static credentialFromResult(
6265
userCredential: externs.UserCredential
6366
): externs.AuthCredential | null {
64-
void userCredential;
65-
return debugFail('not implemented');
67+
const credential = userCredential as UserCredential;
68+
assert(credential._tokenResponse, credential.user.auth.name, AuthErrorCode.ARGUMENT_ERROR);
69+
const {
70+
phoneNumber,
71+
temporaryProof
72+
} = credential._tokenResponse as SignInWithPhoneNumberResponse;
73+
if (phoneNumber && temporaryProof) {
74+
return PhoneAuthCredential._fromTokenResponse(phoneNumber, temporaryProof);
75+
}
76+
77+
fail(credential.user.auth.name, AuthErrorCode.ARGUMENT_ERROR);
6678
}
6779

6880
static _credentialFromError(

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,17 @@ import * as chaiAsPromised from 'chai-as-promised';
2020
import * as sinon from 'sinon';
2121
import * as sinonChai from 'sinon-chai';
2222

23-
import { OperationType } from '@firebase/auth-types-exp';
23+
import { OperationType, ProviderId } from '@firebase/auth-types-exp';
2424
import { FirebaseError } from '@firebase/util';
2525

2626
import { delay } from '../../../test/helpers/delay';
27+
import { TEST_ID_TOKEN_RESPONSE } from '../../../test/helpers/id_token_response';
2728
import { authEvent, BASE_AUTH_EVENT } from '../../../test/helpers/iframe_event';
2829
import { testAuth, testUser } from '../../../test/helpers/mock_auth';
2930
import { makeMockPopupRedirectResolver } from '../../../test/helpers/mock_popup_redirect_resolver';
3031
import { Auth } from '../../model/auth';
3132
import {
32-
AuthEvent,
33-
AuthEventType,
34-
EventManager,
35-
PopupRedirectResolver
33+
AuthEvent, AuthEventType, EventManager, PopupRedirectResolver
3634
} from '../../model/popup_redirect';
3735
import { AuthEventManager } from '../auth/auth_event_manager';
3836
import { AUTH_ERROR_FACTORY, AuthErrorCode } from '../errors';
@@ -87,7 +85,8 @@ describe('src/core/strategies/abstract_popup_redirect_operation', () => {
8785
Promise.resolve(
8886
new UserCredentialImpl(
8987
testUser(auth, 'uid'),
90-
null,
88+
ProviderId.GOOGLE,
89+
{...TEST_ID_TOKEN_RESPONSE},
9190
OperationType.SIGN_IN
9291
)
9392
)
@@ -146,7 +145,7 @@ describe('src/core/strategies/abstract_popup_redirect_operation', () => {
146145
finishPromise(authEvent());
147146
const cred = (await operation.execute())!;
148147
expect(cred.user.uid).to.eq('uid');
149-
expect(cred.credential).to.be.null;
148+
expect(cred._tokenResponse).to.eql(TEST_ID_TOKEN_RESPONSE);
150149
expect(cred.operationType).to.eq(OperationType.SIGN_IN);
151150
});
152151

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

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,7 @@
1717

1818
import { expect } from 'chai';
1919

20-
import {
21-
OperationType,
22-
ProviderId,
23-
SignInMethod
24-
} from '@firebase/auth-types-exp';
20+
import { OperationType, ProviderId, SignInMethod } from '@firebase/auth-types-exp';
2521

2622
import { mockEndpoint } from '../../../test/helpers/api/helper';
2723
import { testAuth, testUser } from '../../../test/helpers/mock_auth';
@@ -54,9 +50,7 @@ describe('core/strategies/anonymous', () => {
5450

5551
describe('signInAnonymously', () => {
5652
it('should sign in an anonymous user', async () => {
57-
const { credential, user, operationType } = await signInAnonymously(auth);
58-
expect(credential?.providerId).to.eq(ProviderId.ANONYMOUS);
59-
expect(credential?.signInMethod).to.eq(SignInMethod.ANONYMOUS);
53+
const { user, operationType } = await signInAnonymously(auth);
6054
expect(operationType).to.eq(OperationType.SIGN_IN);
6155
expect(user.uid).to.eq(serverUser.localId);
6256
expect(user.isAnonymous).to.be.true;
@@ -67,11 +61,9 @@ describe('core/strategies/anonymous', () => {
6761
const userCredential = await signInAnonymously(auth);
6862
expect(userCredential.user.isAnonymous).to.be.true;
6963

70-
const { credential, user, operationType } = await signInAnonymously(
64+
const { user, operationType } = await signInAnonymously(
7165
auth
7266
);
73-
expect(credential?.providerId).to.eq(ProviderId.ANONYMOUS);
74-
expect(credential?.signInMethod).to.eq(SignInMethod.ANONYMOUS);
7567
expect(operationType).to.eq(OperationType.SIGN_IN);
7668
expect(user.uid).to.eq(userCredential.user.uid);
7769
expect(user.isAnonymous).to.be.true;
@@ -84,11 +76,9 @@ describe('core/strategies/anonymous', () => {
8476
await auth.updateCurrentUser(fakeUser);
8577
expect(fakeUser.isAnonymous).to.be.false;
8678

87-
const { credential, user, operationType } = await signInAnonymously(
79+
const { user, operationType } = await signInAnonymously(
8880
auth
8981
);
90-
expect(credential?.providerId).to.eq(ProviderId.ANONYMOUS);
91-
expect(credential?.signInMethod).to.eq(SignInMethod.ANONYMOUS);
9282
expect(operationType).to.eq(OperationType.SIGN_IN);
9383
expect(user.uid).to.not.eq(fakeUser.uid);
9484
expect(user.isAnonymous).to.be.true;

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717

1818
import * as externs from '@firebase/auth-types-exp';
19+
1920
import { Auth } from '../../model/auth';
2021
import { AnonymousProvider } from '../providers/anonymous';
2122
import { UserCredentialImpl } from '../user/user_credential_impl';
@@ -30,7 +31,8 @@ export async function signInAnonymously(
3031
// If an anonymous user is already signed in, no need to sign them in again.
3132
return new UserCredentialImpl(
3233
auth.currentUser,
33-
credential,
34+
null,
35+
undefined,
3436
externs.OperationType.SIGN_IN
3537
);
3638
}

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

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,7 @@ import { expect, use } from 'chai';
1919
import * as chaiAsPromised from 'chai-as-promised';
2020
import { stub } from 'sinon';
2121

22-
import {
23-
OperationType,
24-
ProviderId,
25-
SignInMethod
26-
} from '@firebase/auth-types-exp';
22+
import { OperationType, ProviderId, SignInMethod } from '@firebase/auth-types-exp';
2723
import { FirebaseError } from '@firebase/util';
2824

2925
import { mockEndpoint } from '../../../test/helpers/api/helper';
@@ -37,13 +33,11 @@ import { IdTokenMfaResponse } from '../../api/authentication/mfa';
3733
import { MultiFactorError } from '../../mfa/mfa_error';
3834
import { Auth } from '../../model/auth';
3935
import { IdTokenResponse, IdTokenResponseKind } from '../../model/id_token';
40-
import { User } from '../../model/user';
36+
import { User, UserCredential } from '../../model/user';
4137
import { AuthCredential } from '../credentials';
4238
import { AUTH_ERROR_FACTORY, AuthErrorCode } from '../errors';
4339
import {
44-
linkWithCredential,
45-
reauthenticateWithCredential,
46-
signInWithCredential
40+
linkWithCredential, reauthenticateWithCredential, signInWithCredential
4741
} from './credential';
4842

4943
use(chaiAsPromised);
@@ -95,12 +89,11 @@ describe('core/strategies/credential', () => {
9589
stub(authCredential, '_getIdTokenResponse').returns(
9690
Promise.resolve(idTokenResponse)
9791
);
98-
const { credential, user, operationType } = await signInWithCredential(
92+
const { user, operationType, ...rest } = await signInWithCredential(
9993
auth,
10094
authCredential
10195
);
102-
expect(credential!.providerId).to.eq(ProviderId.FIREBASE);
103-
expect(credential!.signInMethod).to.eq(SignInMethod.EMAIL_LINK);
96+
expect((rest as UserCredential)._tokenResponse).to.eq(idTokenResponse);
10497
expect(user.uid).to.eq('local-id');
10598
expect(user.tenantId).to.eq('tenant-id');
10699
expect(user.displayName).to.eq('display-name');
@@ -171,13 +164,16 @@ describe('core/strategies/credential', () => {
171164
);
172165

173166
const {
174-
credential,
175167
user: newUser,
176-
operationType
168+
operationType,
169+
...rest
177170
} = await reauthenticateWithCredential(user, authCredential);
178171
expect(operationType).to.eq(OperationType.REAUTHENTICATE);
179172
expect(newUser).to.eq(user);
180-
expect(credential).to.be.null;
173+
expect((rest as UserCredential)._tokenResponse).to.eql({
174+
...idTokenResponse,
175+
idToken: makeJWT({ sub: 'uid' })
176+
});
181177
});
182178
});
183179

@@ -206,13 +202,13 @@ describe('core/strategies/credential', () => {
206202
Promise.resolve(idTokenResponse)
207203
);
208204
const {
209-
credential,
210205
user: newUser,
211-
operationType
206+
operationType,
207+
...rest
212208
} = await linkWithCredential(user, authCredential);
213209
expect(operationType).to.eq(OperationType.LINK);
214210
expect(newUser).to.eq(user);
215-
expect(credential).to.be.null;
211+
expect((rest as UserCredential)._tokenResponse).to.eq(idTokenResponse);
216212
});
217213
});
218214
});

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
*/
1717

1818
import * as externs from '@firebase/auth-types-exp';
19-
2019
import { OperationType, UserCredential } from '@firebase/auth-types-exp';
20+
2121
import { _processCredentialSavingMfaContextIfNecessary } from '../../mfa/mfa_error';
2222
import { Auth } from '../../model/auth';
2323
import { User } from '../../model/user';

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { Endpoint } from '../../api';
2727
import { APIUserInfo } from '../../api/account_management/account';
2828
import { Auth } from '../../model/auth';
2929
import { IdTokenResponse, IdTokenResponseKind } from '../../model/id_token';
30+
import { UserCredential } from '../../model/user';
3031
import { signInWithCustomToken } from './custom_token';
3132

3233
use(chaiAsPromised);
@@ -65,11 +66,11 @@ describe('core/strategies/signInWithCustomToken', () => {
6566
afterEach(mockFetch.tearDown);
6667

6768
it('should return a valid user credential', async () => {
68-
const { credential, user, operationType } = await signInWithCustomToken(
69+
const { user, operationType, _tokenResponse } = await signInWithCustomToken(
6970
auth,
7071
'look-at-me-im-a-jwt'
71-
);
72-
expect(credential).to.be.null;
72+
) as UserCredential;
73+
expect(_tokenResponse).to.eql(idTokenResponse);
7374
expect(user.uid).to.eq('local-id');
7475
expect(user.tenantId).to.eq('tenant-id');
7576
expect(user.displayName).to.eq('display-name');

0 commit comments

Comments
 (0)