Skip to content

Commit

Permalink
feat: added firebase appCheck support to client
Browse files Browse the repository at this point in the history
  • Loading branch information
dereekb committed May 27, 2022
1 parent 946a20e commit e9377d1
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 5 deletions.
3 changes: 3 additions & 0 deletions apps/demo/src/environments/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ export const base: DemoEnvironment = {
...firebaseInfo.emulators,
useEmulators: true,
host: '0.0.0.0'
},
appCheck: {
reCaptchaV3: '6LfojyAgAAAAADvgGBkWUbRJy-4660ZgkLFOtMvS'
}
}
};
Expand Down
2 changes: 1 addition & 1 deletion apps/demo/src/root.firebase.module.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { FirestoreContext } from '@dereekb/firebase';
import { DbxFirebaseFirestoreCollectionModule, DbxFirebaseEmulatorModule, DbxFirebaseDefaultFirebaseProvidersModule, DbxFirebaseAuthModule, DbxFirebaseFunctionsModule } from '@dereekb/dbx-firebase';
import { DbxFirebaseFirestoreCollectionModule, DbxFirebaseEmulatorModule, DbxFirebaseDefaultFirebaseProvidersModule, DbxFirebaseAuthModule, DbxFirebaseFunctionsModule, DbxFirebaseDefaultAppCheckProviderModule } from '@dereekb/dbx-firebase';
import { NgModule } from '@angular/core';
import { environment } from './environments/environment';
import { DemoFirebaseFunctionsGetter, DemoFirestoreCollections, DEMO_FIREBASE_FUNCTIONS_CONFIG, makeDemoFirebaseFunctions, makeDemoFirestoreCollections } from '@dereekb/demo-firebase';
Expand Down
6 changes: 6 additions & 0 deletions packages/dbx-firebase/src/lib/firebase/appcheck.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { AppCheckOptions } from '@firebase/app-check';

export interface DbxFirebaseAppCheckConfig extends Partial<Omit<AppCheckOptions, 'provider'>> {
reCaptchaV3: string;
disabled?: boolean;
}
46 changes: 42 additions & 4 deletions packages/dbx-firebase/src/lib/firebase/firebase.module.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { ModuleWithProviders, NgModule, Injector, InjectionToken } from '@angular/core';
import { FirebaseOptions, initializeApp } from 'firebase/app';
import { initializeAppCheck, ReCaptchaV3Provider } from 'firebase/app-check';
import { FirebaseApp, provideFirebaseApp } from '@angular/fire/app';
import { provideStorage, getStorage, connectStorageEmulator } from '@angular/fire/storage';
import { provideFunctions, getFunctions, connectFunctionsEmulator } from '@angular/fire/functions';
import { provideFirestore, getFirestore, connectFirestoreEmulator, enableIndexedDbPersistence } from '@angular/fire/firestore';
import { provideAuth, getAuth, connectAuthEmulator } from '@angular/fire/auth';
import { AppCheck, provideAppCheck } from '@angular/fire/app-check';
import { DbxFirebaseParsedEmulatorsConfig } from './emulators';
import { DbxFirebaseOptions } from './options';

Expand All @@ -30,7 +32,40 @@ import { DbxFirebaseOptions } from './options';
}) as any)
]
})
export class DbxFirebaseDefaultFirestoreProviderModule {}
export class DbxFirebaseDefaultFirestoreProviderModule { }

/**
* Default firebase app check provider module.
*/
@NgModule({
imports: [
provideAppCheck(((injector: Injector) => {
const firebaseApp = injector.get(FirebaseApp);
const firebaseOptions = injector.get<DbxFirebaseOptions>(DBX_FIREBASE_OPTIONS_TOKEN);
const appCheckOptions = firebaseOptions.appCheck;
const appCheckKnowinglyDisabled = appCheckOptions?.disabled === true || firebaseOptions.emulators?.useEmulators === true;

let appCheck: AppCheck;

if (appCheckOptions && !appCheckKnowinglyDisabled) {
// Only enabled outside of app-check environments. The emulators will not use appcheck.
appCheck = initializeAppCheck(firebaseApp, {
provider: new ReCaptchaV3Provider(appCheckOptions.reCaptchaV3),
isTokenAutoRefreshEnabled: appCheckOptions.isTokenAutoRefreshEnabled ?? true
});
} else {
appCheck = undefined as unknown as AppCheck;

if (!appCheckKnowinglyDisabled) {
console.error('dbx-firebase: No appcheck configuration for the app, and not specifically disabled in config either.');
}
}

return appCheck;
}) as any)
]
})
export class DbxFirebaseDefaultAppCheckProviderModule { }

/**
* Default firebase auth provider module.
Expand All @@ -50,7 +85,7 @@ export class DbxFirebaseDefaultFirestoreProviderModule {}
}) as any)
]
})
export class DbxFirebaseDefaultAuthProviderModule {}
export class DbxFirebaseDefaultAuthProviderModule { }

/**
* Default firebase storage provider module.
Expand All @@ -70,7 +105,7 @@ export class DbxFirebaseDefaultAuthProviderModule {}
}) as any)
]
})
export class DbxFirebaseDefaultStorageProviderModule {}
export class DbxFirebaseDefaultStorageProviderModule { }

/**
* Default firebase functions provider module.
Expand All @@ -93,7 +128,7 @@ export class DbxFirebaseDefaultStorageProviderModule {}
}) as any)
]
})
export class DbxFirebaseDefaultFunctionsProviderModule {}
export class DbxFirebaseDefaultFunctionsProviderModule { }

export const DBX_FIREBASE_OPTIONS_TOKEN = new InjectionToken('DbxFirebaseOptions');

Expand All @@ -106,13 +141,15 @@ export const DBX_FIREBASE_OPTIONS_TOKEN = new InjectionToken('DbxFirebaseOptions
const firebaseOptions = injector.get<DbxFirebaseOptions>(DBX_FIREBASE_OPTIONS_TOKEN);
return initializeApp(firebaseOptions);
}) as any),
DbxFirebaseDefaultAppCheckProviderModule,
DbxFirebaseDefaultFirestoreProviderModule,
DbxFirebaseDefaultAuthProviderModule,
DbxFirebaseDefaultStorageProviderModule,
DbxFirebaseDefaultFunctionsProviderModule
]
})
export class DbxFirebaseDefaultFirebaseProvidersModule {

static forRoot(firebaseOptions: FirebaseOptions): ModuleWithProviders<DbxFirebaseDefaultFirebaseProvidersModule> {
return {
ngModule: DbxFirebaseDefaultFirebaseProvidersModule,
Expand All @@ -124,4 +161,5 @@ export class DbxFirebaseDefaultFirebaseProvidersModule {
]
};
}

}
1 change: 1 addition & 0 deletions packages/dbx-firebase/src/lib/firebase/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './appcheck';
export * from './emulators';
export * from './firebase.module';
export * from './firebase.emulator.module';
Expand Down
5 changes: 5 additions & 0 deletions packages/dbx-firebase/src/lib/firebase/options.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
import { FirebaseOptions } from 'firebase/app';
import { DbxFirebaseLoginModuleRootConfig } from '../auth/login/firebase.login.module';
import { DbxFirebaseAppCheckConfig } from './appcheck';
import { DbxFirebaseEmulatorsConfig } from './emulators';

export interface DbxFirebaseOptions extends FirebaseOptions, Pick<DbxFirebaseLoginModuleRootConfig, 'enabledLoginMethods'> {
emulators: DbxFirebaseEmulatorsConfig;
/**
* Firebase AppCheck handling
*/
appCheck?: DbxFirebaseAppCheckConfig;
/**
* Passed to the Functions initialization to set the domain to use when sending requests.
*/
Expand Down

0 comments on commit e9377d1

Please sign in to comment.