18
18
import * as externs from '@firebase/auth-types-exp' ;
19
19
import { OperationType , UserCredential } from '@firebase/auth-types-exp' ;
20
20
21
- import { PhoneOrOauthTokenResponse } from '../../api/authentication/mfa' ;
22
- import { SignInWithPhoneNumberResponse } from '../../api/authentication/sms' ;
23
21
import { Auth } from '../../model/auth' ;
24
- import { IdTokenResponse } from '../../model/id_token' ;
25
22
import { User } from '../../model/user' ;
26
23
import { AuthCredential } from '../credentials' ;
27
- import { PhoneAuthCredential } from '../credentials/phone' ;
28
- import { AuthErrorCode } from '../errors' ;
29
24
import { _parseToken } from '../user/id_token_result' ;
25
+ import { _assertLinkedStatus , _link } from '../user/link_unlink' ;
26
+ import { _reauthenticate } from '../user/reauthenticate' ;
30
27
import { _reloadWithoutSaving } from '../user/reload' ;
31
28
import { UserCredentialImpl } from '../user/user_credential_impl' ;
32
- import { assert , fail } from '../util/assert' ;
33
- import { providerDataAsNames } from '../util/providers' ;
34
29
35
30
export async function signInWithCredential (
36
31
authExtern : externs . Auth ,
@@ -56,14 +51,13 @@ export async function linkWithCredential(
56
51
) : Promise < UserCredential > {
57
52
const user = userExtern as User ;
58
53
const credential = credentialExtern as AuthCredential ;
54
+
59
55
await _assertLinkedStatus ( false , user , credential . providerId ) ;
60
56
61
- const response = await credential . _linkToIdToken (
62
- user . auth ,
63
- await user . getIdToken ( )
57
+ return _link (
58
+ user ,
59
+ credential . _linkToIdToken ( user . auth , await user . getIdToken ( ) )
64
60
) ;
65
-
66
- return userCredForOperation ( user , OperationType . LINK , response ) ;
67
61
}
68
62
69
63
export async function reauthenticateWithCredential (
@@ -73,76 +67,8 @@ export async function reauthenticateWithCredential(
73
67
const credential = credentialExtern as AuthCredential ;
74
68
const user = userExtern as User ;
75
69
76
- const { auth, uid } = user ;
77
- const response = await verifyTokenResponseUid (
78
- credential . _getReauthenticationResolver ( auth ) ,
79
- uid ,
80
- auth . name
70
+ return _reauthenticate (
71
+ user ,
72
+ credential . _getReauthenticationResolver ( user . auth )
81
73
) ;
82
-
83
- return userCredForOperation ( user , OperationType . REAUTHENTICATE , response ) ;
84
- }
85
-
86
- export function _authCredentialFromTokenResponse (
87
- response : PhoneOrOauthTokenResponse
88
- ) : AuthCredential | null {
89
- const {
90
- temporaryProof,
91
- phoneNumber
92
- } = response as SignInWithPhoneNumberResponse ;
93
- if ( temporaryProof && phoneNumber ) {
94
- return new PhoneAuthCredential ( { temporaryProof, phoneNumber } ) ;
95
- }
96
-
97
- // TODO: Handle Oauth cases
98
- return null ;
99
- }
100
-
101
- export async function _assertLinkedStatus (
102
- expected : boolean ,
103
- user : User ,
104
- provider : externs . ProviderId
105
- ) : Promise < void > {
106
- await _reloadWithoutSaving ( user ) ;
107
- const providerIds = providerDataAsNames ( user . providerData ) ;
108
-
109
- const code =
110
- expected === false
111
- ? AuthErrorCode . PROVIDER_ALREADY_LINKED
112
- : AuthErrorCode . NO_SUCH_PROVIDER ;
113
- assert ( providerIds . has ( provider ) === expected , user . auth . name , code ) ;
114
- }
115
-
116
- async function verifyTokenResponseUid (
117
- idTokenResolver : Promise < IdTokenResponse > ,
118
- uid : string ,
119
- appName : string
120
- ) : Promise < IdTokenResponse > {
121
- try {
122
- const response = await idTokenResolver ;
123
- assert ( response . idToken , appName , AuthErrorCode . INTERNAL_ERROR ) ;
124
- const parsed = _parseToken ( response . idToken ) ;
125
- assert ( parsed , appName , AuthErrorCode . INTERNAL_ERROR ) ;
126
-
127
- const { sub : localId } = parsed ;
128
- assert ( uid === localId , appName , AuthErrorCode . USER_MISMATCH ) ;
129
-
130
- return response ;
131
- } catch ( e ) {
132
- // Convert user deleted error into user mismatch
133
- if ( e ?. code === `auth/${ AuthErrorCode . USER_DELETED } ` ) {
134
- fail ( appName , AuthErrorCode . USER_MISMATCH ) ;
135
- }
136
- throw e ;
137
- }
138
- }
139
-
140
- async function userCredForOperation (
141
- user : User ,
142
- opType : OperationType ,
143
- response : IdTokenResponse
144
- ) : Promise < UserCredentialImpl > {
145
- const newCred = _authCredentialFromTokenResponse ( response ) ;
146
- await user . _updateTokensIfNecessary ( response , /* reload */ true ) ;
147
- return new UserCredentialImpl ( user , newCred , opType ) ;
148
74
}
0 commit comments