Skip to content

Port 3P token API to app-check-exp #5069

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jun 30, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 10 additions & 21 deletions packages-exp/app-check-exp/src/api.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
*/
import '../test/setup';
import { expect } from 'chai';
import { match, spy, stub } from 'sinon';
import { spy, stub } from 'sinon';
import {
setTokenAutoRefreshEnabled,
initializeAppCheck,
Expand All @@ -29,7 +29,6 @@ import {
getFakeApp,
getFakeGreCAPTCHA,
getFakeAppCheck,
getFakePlatformLoggingProvider,
removegreCAPTCHAScriptsOnPage
} from '../test/util';
import { clearState, getState } from './state';
Expand All @@ -41,6 +40,7 @@ import * as storage from './storage';
import * as internalApi from './internal-api';
import { deleteApp, FirebaseApp } from '@firebase/app-exp';
import { ReCaptchaV3Provider } from './providers';
import { AppCheckService } from './factory';

describe('api', () => {
let app: FirebaseApp;
Expand Down Expand Up @@ -122,11 +122,7 @@ describe('api', () => {
token: 'a-token-string'
});
await getToken(appCheck, true);
expect(internalGetToken).to.be.calledWith(
appCheck.app,
match.any, // platformLoggerProvider
true
);
expect(internalGetToken).to.be.calledWith(appCheck, true);
});
it('getToken() throws errors returned with token', async () => {
const app = getFakeApp({ automaticDataCollectionEnabled: true });
Expand Down Expand Up @@ -160,9 +156,7 @@ describe('api', () => {
);
stub(storage, 'writeTokenToStorage').returns(Promise.resolve(undefined));

const listener1 = (): void => {
throw new Error();
};
const listener1 = stub().throws(new Error());
const listener2 = spy();

const errorFn1 = spy();
Expand All @@ -173,11 +167,9 @@ describe('api', () => {

expect(getState(app).tokenObservers.length).to.equal(2);

await internalApi.getToken(
appCheck.app,
getFakePlatformLoggingProvider()
);
await internalApi.getToken(appCheck as AppCheckService);

expect(listener1).to.be.called;
expect(listener2).to.be.calledWith({
token: fakeRecaptchaAppCheckToken.token
});
Expand All @@ -194,7 +186,6 @@ describe('api', () => {
provider: new ReCaptchaV3Provider(FAKE_SITE_KEY),
isTokenAutoRefreshEnabled: true
});
const fakePlatformLoggingProvider = getFakePlatformLoggingProvider();
const fakeRecaptchaToken = 'fake-recaptcha-token';
const fakeRecaptchaAppCheckToken = {
token: 'fake-recaptcha-app-check-token',
Expand All @@ -207,9 +198,7 @@ describe('api', () => {
);
stub(storage, 'writeTokenToStorage').returns(Promise.resolve(undefined));

const listener1 = (): void => {
throw new Error();
};
const listener1 = stub().throws(new Error());
const listener2 = spy();

const errorFn1 = spy();
Expand All @@ -230,8 +219,9 @@ describe('api', () => {

expect(getState(app).tokenObservers.length).to.equal(2);

await internalApi.getToken(appCheck.app, fakePlatformLoggingProvider);
await internalApi.getToken(appCheck as AppCheckService);

expect(listener1).to.be.called;
expect(listener2).to.be.calledWith({
token: fakeRecaptchaAppCheckToken.token
});
Expand All @@ -249,7 +239,6 @@ describe('api', () => {
provider: new ReCaptchaV3Provider(FAKE_SITE_KEY),
isTokenAutoRefreshEnabled: false
});
const fakePlatformLoggingProvider = getFakePlatformLoggingProvider();
const fakeRecaptchaToken = 'fake-recaptcha-token';
stub(reCAPTCHA, 'getToken').returns(Promise.resolve(fakeRecaptchaToken));
stub(client, 'exchangeToken').rejects('exchange error');
Expand All @@ -261,7 +250,7 @@ describe('api', () => {

const unsubscribe1 = onTokenChanged(appCheck, listener1, errorFn1);

await internalApi.getToken(app, fakePlatformLoggingProvider);
await internalApi.getToken(appCheck as AppCheckService);

expect(getState(app).tokenObservers.length).to.equal(1);

Expand Down
9 changes: 4 additions & 5 deletions packages-exp/app-check-exp/src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import {
Unsubscribe
} from '@firebase/util';
import { AppCheckService } from './factory';
import { AppCheckProvider } from './types';
import { AppCheckProvider, ListenerType } from './types';
import {
getToken as getTokenInternal,
addTokenListener,
Expand Down Expand Up @@ -141,8 +141,7 @@ export async function getToken(
forceRefresh?: boolean
): Promise<AppCheckTokenResult> {
const result = await getTokenInternal(
appCheckInstance.app,
(appCheckInstance as AppCheckService).platformLoggerProvider,
appCheckInstance as AppCheckService,
forceRefresh
);
if (result.error) {
Expand Down Expand Up @@ -231,8 +230,8 @@ export function onTokenChanged(
errorFn = onError;
}
addTokenListener(
appCheckInstance.app,
(appCheckInstance as AppCheckService).platformLoggerProvider,
appCheckInstance as AppCheckService,
ListenerType['3P'],
nextFn,
errorFn
);
Expand Down
30 changes: 15 additions & 15 deletions packages-exp/app-check-exp/src/factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
*/

import { AppCheck } from './public-types';
import { FirebaseApp, _FirebaseService, _getProvider } from '@firebase/app-exp';
import { FirebaseAppCheckInternal } from './types';
import { FirebaseApp, _FirebaseService } from '@firebase/app-exp';
import { FirebaseAppCheckInternal, ListenerType } from './types';
import {
getToken,
addTokenListener,
Expand All @@ -29,29 +29,29 @@ import { Provider } from '@firebase/component';
* AppCheck Service class.
*/
export class AppCheckService implements AppCheck, _FirebaseService {
platformLoggerProvider: Provider<'platform-logger'>;

constructor(public app: FirebaseApp) {
this.platformLoggerProvider = _getProvider(app, 'platform-logger');
}
constructor(
public app: FirebaseApp,
public platformLoggerProvider: Provider<'platform-logger'>
) {}
_delete(): Promise<void> {
return Promise.resolve();
}
}

export function factory(app: FirebaseApp): AppCheckService {
return new AppCheckService(app);
export function factory(
app: FirebaseApp,
platformLoggerProvider: Provider<'platform-logger'>
): AppCheckService {
return new AppCheckService(app, platformLoggerProvider);
}

export function internalFactory(
app: FirebaseApp,
platformLoggerProvider: Provider<'platform-logger'>
appCheck: AppCheckService
): FirebaseAppCheckInternal {
return {
getToken: forceRefresh =>
getToken(app, platformLoggerProvider, forceRefresh),
getToken: forceRefresh => getToken(appCheck, forceRefresh),
addTokenListener: listener =>
addTokenListener(app, platformLoggerProvider, listener),
removeTokenListener: listener => removeTokenListener(app, listener)
addTokenListener(appCheck, ListenerType['2P'], listener),
removeTokenListener: listener => removeTokenListener(appCheck.app, listener)
};
}
9 changes: 4 additions & 5 deletions packages-exp/app-check-exp/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ function registerAppCheck(): void {
container => {
// getImmediate for FirebaseApp will always succeed
const app = container.getProvider('app-exp').getImmediate();
return factory(app);
const platformLoggerProvider = container.getProvider('platform-logger');
return factory(app, platformLoggerProvider);
},
ComponentType.PUBLIC
)
Expand All @@ -50,10 +51,8 @@ function registerAppCheck(): void {
new Component(
APP_CHECK_NAME_INTERNAL,
container => {
// getImmediate for FirebaseApp will always succeed
const app = container.getProvider('app-exp').getImmediate();
const platformLoggerProvider = container.getProvider('platform-logger');
return internalFactory(app, platformLoggerProvider);
const appCheck = container.getProvider('app-check-exp').getImmediate();
return internalFactory(appCheck);
},
ComponentType.PUBLIC
)
Expand Down
Loading