From 0ab9ce415657ed29945017a22d42a6dad2dc2a13 Mon Sep 17 00:00:00 2001 From: Christina Holland Date: Thu, 13 Feb 2025 16:08:46 -0800 Subject: [PATCH 1/2] Change log level to warning --- .changeset/tough-kiwis-smile.md | 5 +++ packages/app-check/src/internal-api.test.ts | 23 ++++++++++ packages/app-check/src/internal-api.ts | 48 +++++++++++++-------- 3 files changed, 58 insertions(+), 18 deletions(-) create mode 100644 .changeset/tough-kiwis-smile.md diff --git a/.changeset/tough-kiwis-smile.md b/.changeset/tough-kiwis-smile.md new file mode 100644 index 00000000000..47e6d4caff8 --- /dev/null +++ b/.changeset/tough-kiwis-smile.md @@ -0,0 +1,5 @@ +--- +'@firebase/app-check': patch +--- + +Fixed a bug that caused an error to be thrown when the debug exchange failed. diff --git a/packages/app-check/src/internal-api.test.ts b/packages/app-check/src/internal-api.test.ts index 360ec3a026a..13d634b5cd9 100644 --- a/packages/app-check/src/internal-api.test.ts +++ b/packages/app-check/src/internal-api.test.ts @@ -176,6 +176,29 @@ describe('internal api', () => { errorStub.restore(); }); + it('resolves with a dummy token and an error if failed to get a token in debug mode', async () => { + const errorStub = stub(console, 'error'); + window.FIREBASE_APPCHECK_DEBUG_TOKEN = true; + const appCheck = initializeAppCheck(app, { + provider: new ReCaptchaV3Provider(FAKE_SITE_KEY) + }); + + const error = new Error('oops, something went wrong'); + stub(client, 'exchangeToken').returns(Promise.reject(error)); + + const token = await getToken(appCheck as AppCheckService); + + expect(token).to.deep.equal({ + token: formatDummyToken(defaultTokenErrorData), + error + }); + expect(errorStub.args[0][1].message).to.include( + 'oops, something went wrong' + ); + window.FIREBASE_APPCHECK_DEBUG_TOKEN = false; + errorStub.restore(); + }); + it('resolves with a dummy token and an error if recaptcha failed', async () => { const errorStub = stub(console, 'error'); const appCheck = initializeAppCheck(app, { diff --git a/packages/app-check/src/internal-api.ts b/packages/app-check/src/internal-api.ts index 728f2ca5e68..068a00d8c02 100644 --- a/packages/app-check/src/internal-api.ts +++ b/packages/app-check/src/internal-api.ts @@ -116,24 +116,36 @@ export async function getToken( * Check token using the debug token, and return it directly. */ if (isDebugMode()) { - // Avoid making another call to the exchange endpoint if one is in flight. - if (!state.exchangeTokenPromise) { - state.exchangeTokenPromise = exchangeToken( - getExchangeDebugTokenRequest(app, await getDebugToken()), - appCheck.heartbeatServiceProvider - ).finally(() => { - // Clear promise when settled - either resolved or rejected. - state.exchangeTokenPromise = undefined; - }); - shouldCallListeners = true; + try { + // Avoid making another call to the exchange endpoint if one is in flight. + if (!state.exchangeTokenPromise) { + state.exchangeTokenPromise = exchangeToken( + getExchangeDebugTokenRequest(app, await getDebugToken()), + appCheck.heartbeatServiceProvider + ).finally(() => { + // Clear promise when settled - either resolved or rejected. + state.exchangeTokenPromise = undefined; + }); + shouldCallListeners = true; + } + const tokenFromDebugExchange: AppCheckTokenInternal = + await state.exchangeTokenPromise; + // Write debug token to indexedDB. + await writeTokenToStorage(app, tokenFromDebugExchange); + // Write debug token to state. + state.token = tokenFromDebugExchange; + return { token: tokenFromDebugExchange.token }; + } catch (e) { + if ((e as FirebaseError).code === `appCheck/${AppCheckError.THROTTLED}`) { + // Warn if throttled, but do not treat it as an error. + logger.warn((e as FirebaseError).message); + } else { + // `getToken()` should never throw, but logging error text to console will aid debugging. + logger.warn(e); + } + // Return dummy token and error + return makeDummyTokenResult(e as FirebaseError); } - const tokenFromDebugExchange: AppCheckTokenInternal = - await state.exchangeTokenPromise; - // Write debug token to indexedDB. - await writeTokenToStorage(app, tokenFromDebugExchange); - // Write debug token to state. - state.token = tokenFromDebugExchange; - return { token: tokenFromDebugExchange.token }; } /** @@ -160,7 +172,7 @@ export async function getToken( logger.warn((e as FirebaseError).message); } else { // `getToken()` should never throw, but logging error text to console will aid debugging. - logger.error(e); + logger.warn(e); } // Always save error to be added to dummy token. error = e as FirebaseError; From 1317836f83933dddf5a326d05dbfaa592eab7bb2 Mon Sep 17 00:00:00 2001 From: Christina Holland Date: Tue, 18 Feb 2025 12:03:22 -0800 Subject: [PATCH 2/2] change it back to logger.error --- packages/app-check/src/internal-api.test.ts | 2 +- packages/app-check/src/internal-api.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/app-check/src/internal-api.test.ts b/packages/app-check/src/internal-api.test.ts index 13d634b5cd9..1e43a5e7e21 100644 --- a/packages/app-check/src/internal-api.test.ts +++ b/packages/app-check/src/internal-api.test.ts @@ -195,7 +195,7 @@ describe('internal api', () => { expect(errorStub.args[0][1].message).to.include( 'oops, something went wrong' ); - window.FIREBASE_APPCHECK_DEBUG_TOKEN = false; + delete window.FIREBASE_APPCHECK_DEBUG_TOKEN; errorStub.restore(); }); diff --git a/packages/app-check/src/internal-api.ts b/packages/app-check/src/internal-api.ts index 068a00d8c02..4eb3953614a 100644 --- a/packages/app-check/src/internal-api.ts +++ b/packages/app-check/src/internal-api.ts @@ -141,7 +141,7 @@ export async function getToken( logger.warn((e as FirebaseError).message); } else { // `getToken()` should never throw, but logging error text to console will aid debugging. - logger.warn(e); + logger.error(e); } // Return dummy token and error return makeDummyTokenResult(e as FirebaseError); @@ -172,7 +172,7 @@ export async function getToken( logger.warn((e as FirebaseError).message); } else { // `getToken()` should never throw, but logging error text to console will aid debugging. - logger.warn(e); + logger.error(e); } // Always save error to be added to dummy token. error = e as FirebaseError;