@@ -135,6 +135,7 @@ export class FirebaseCredentialsProvider implements CredentialsProvider {
135
135
136
136
/** Tracks the current User. */
137
137
private currentUser : User = User . UNAUTHENTICATED ;
138
+ private receivedInitialUser : boolean = false ;
138
139
139
140
/**
140
141
* Counter used to detect if the token changed while a getToken request was
@@ -151,12 +152,12 @@ export class FirebaseCredentialsProvider implements CredentialsProvider {
151
152
this . tokenListener = ( ) => {
152
153
this . tokenCounter ++ ;
153
154
this . currentUser = this . getUser ( ) ;
155
+ this . receivedInitialUser = true ;
154
156
if ( this . changeListener ) {
155
157
this . changeListener ( this . currentUser ) ;
156
158
}
157
159
} ;
158
160
159
- this . currentUser = this . getUser ( ) ;
160
161
this . tokenCounter = 0 ;
161
162
162
163
// Will fire at least once where we set this.currentUser
@@ -211,7 +212,9 @@ export class FirebaseCredentialsProvider implements CredentialsProvider {
211
212
this . changeListener = changeListener ;
212
213
213
214
// Fire the initial event
214
- changeListener ( this . currentUser ) ;
215
+ if ( this . receivedInitialUser ) {
216
+ changeListener ( this . currentUser ) ;
217
+ }
215
218
}
216
219
217
220
removeChangeListener ( ) : void {
@@ -227,6 +230,10 @@ export class FirebaseCredentialsProvider implements CredentialsProvider {
227
230
this . changeListener = null ;
228
231
}
229
232
233
+ // Auth.getUid() can return null even with a user logged in. It is because
234
+ // getUid() is synchronous, but the auth code populating Uid is asynchronous.
235
+ // This method should only be called in the AuthTokenListener callback
236
+ // to guarantee to get the actual user.
230
237
private getUser ( ) : User {
231
238
const currentUid = ( this . app as _FirebaseApp ) . INTERNAL . getUid ( ) ;
232
239
assert (
0 commit comments