Skip to content

Commit a2affb2

Browse files
Merge 71e52aa into 29327b2
2 parents 29327b2 + 71e52aa commit a2affb2

File tree

2 files changed

+27
-27
lines changed

2 files changed

+27
-27
lines changed

.changeset/eleven-rocks-hunt.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@firebase/firestore": patch
3+
---
4+
5+
Removed an authentication fallback that may have caused excessive usage of Firebase Auth's `getToken` API.

packages/firestore/src/api/credentials.ts

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,10 @@ export class FirebaseCredentialsProvider implements CredentialsProvider {
147147
private receivedInitialUser: boolean = false;
148148

149149
/**
150-
* Counter used to detect if the token changed while a getToken request was
151-
* outstanding.
150+
* The last token received either via the token listener or the getToken()
151+
* API.
152152
*/
153-
private tokenCounter = 0;
153+
private lastToken: OAuthToken | null = null;
154154

155155
/** The listener registered with setChangeListener(). */
156156
private changeListener: CredentialChangeListener | null = null;
@@ -160,17 +160,15 @@ export class FirebaseCredentialsProvider implements CredentialsProvider {
160160
private auth: FirebaseAuthInternal | null;
161161

162162
constructor(authProvider: Provider<FirebaseAuthInternalName>) {
163-
this.tokenListener = () => {
164-
this.tokenCounter++;
163+
this.tokenListener = token => {
165164
this.currentUser = this.getUser();
165+
this.lastToken = token ? new OAuthToken(token, this.currentUser) : null;
166166
this.receivedInitialUser = true;
167167
if (this.changeListener) {
168168
this.changeListener(this.currentUser);
169169
}
170170
};
171171

172-
this.tokenCounter = 0;
173-
174172
this.auth = authProvider.getImmediate({ optional: true });
175173

176174
if (this.auth) {
@@ -199,38 +197,35 @@ export class FirebaseCredentialsProvider implements CredentialsProvider {
199197
'getToken cannot be called after listener removed.'
200198
);
201199

202-
// Take note of the current value of the tokenCounter so that this method
203-
// can fail (with an ABORTED error) if there is a token change while the
204-
// request is outstanding.
205-
const initialTokenCounter = this.tokenCounter;
206200
const forceRefresh = this.forceRefresh;
207201
this.forceRefresh = false;
208202

209203
if (!this.auth) {
210204
return Promise.resolve(null);
211205
}
212206

207+
this.lastToken = null;
213208
return this.auth.getToken(forceRefresh).then(tokenData => {
214-
// Cancel the request since the token changed while the request was
215-
// outstanding so the response is potentially for a previous user (which
216-
// user, we can't be sure).
217-
if (this.tokenCounter !== initialTokenCounter) {
209+
if (this.lastToken) {
210+
// If we received a new token while this callback was pending (via
211+
// `this.tokenListener`), use the new token instead of the one received
212+
// via `getToken()`.
218213
logDebug(
219214
'FirebaseCredentialsProvider',
220-
'getToken aborted due to token change.'
215+
'Re-using token from token listener.'
216+
);
217+
} else if (tokenData) {
218+
hardAssert(
219+
typeof tokenData.accessToken === 'string',
220+
'Invalid tokenData returned from getToken():' + tokenData
221+
);
222+
this.lastToken = new OAuthToken(
223+
tokenData.accessToken,
224+
this.currentUser
221225
);
222-
return this.getToken();
223-
} else {
224-
if (tokenData) {
225-
hardAssert(
226-
typeof tokenData.accessToken === 'string',
227-
'Invalid tokenData returned from getToken():' + tokenData
228-
);
229-
return new OAuthToken(tokenData.accessToken, this.currentUser);
230-
} else {
231-
return null;
232-
}
233226
}
227+
228+
return this.lastToken;
234229
});
235230
}
236231

0 commit comments

Comments
 (0)