A streamlined NestJS module that provides Firebase integration, including authentication, Firestore access, and Firebase Admin SDK initialization. This package simplifies the integration of Firebase services into your NestJS application with type-safe decorators and guards.
- π₯ Firebase Admin SDK initialization with async configuration
- π Built-in authentication guard
- π― Type-safe user decorators
- π Easy access to Firestore, Auth, and Admin App instances
- π NestJS ConfigService integration
npm install @reyco1/nestjs-firebase
This package has the following peer dependencies:
- @nestjs/common: ^11.0.8
- @nestjs/core: ^11.0.8
- @nestjs/config: ^4.0.0
- firebase-admin: ^13.1.0
-
Download your Firebase service account key JSON file from the Firebase Console.
-
Configure the Firebase module in your
app.module.ts
:
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { FirebaseModule } from '@reyco1/nestjs-firebase';
@Module({
imports: [
ConfigModule.forRoot(),
FirebaseModule.forRootAsync({
imports: [ConfigModule],
useFactory: (configService: ConfigService) => ({
serviceAccountPath: configService.get<string>('FIREBASE_SERVICE_ACCOUNT_PATH'),
}),
inject: [ConfigService],
}),
],
})
export class AppModule {}
- Use the guard and decorators to protect your routes:
import { Controller, Get, UseGuards } from '@nestjs/common';
import { FirebaseAuthGuard, User, UserId } from '@reyco1/nestjs-firebase';
@Controller('protected')
@UseGuards(FirebaseAuthGuard)
export class ProtectedController {
@Get()
getProtectedResource(
@UserId() userId: string,
@User() user: FirebaseUser
) {
return {
message: 'This is protected',
userId,
userEmail: user.email
};
}
}
FirebaseModule.forRootAsync({
imports: [ConfigModule],
useFactory: (configService: ConfigService) => ({
serviceAccountPath: configService.get<string>('FIREBASE_SERVICE_ACCOUNT_PATH'),
}),
inject: [ConfigService],
})
FirebaseModule.forRoot({
serviceAccountPath: './path/to/serviceAccountKey.json',
})
The FirebaseService
provides direct access to Firebase Admin SDK instances:
import { Injectable } from '@nestjs/common';
import { FirebaseService } from '@reyco1/nestjs-firebase';
@Injectable()
export class YourService {
constructor(private firebaseService: FirebaseService) {}
async someMethod() {
// Access Firebase Admin instances
const app = this.firebaseService.app;
const auth = this.firebaseService.auth;
const firestore = this.firebaseService.firestore;
}
}
Protects routes by validating Firebase ID tokens:
@UseGuards(FirebaseAuthGuard)
@Get()
protectedRoute() {
return 'This route is protected';
}
// Get full user object
@User() user: FirebaseUser
// Get specific user property
@User('email') email: string
@UserId() userId: string
interface FirebaseUser {
uid: string;
email?: string;
displayName?: string;
photoURL?: string;
phoneNumber?: string;
disabled?: boolean;
emailVerified?: boolean;
metadata?: {
creationTime?: string;
lastSignInTime?: string;
};
customClaims?: { [key: string]: any };
[key: string]: any;
}
- Environment Variables: Store your service account path in environment variables:
FIREBASE_SERVICE_ACCOUNT_PATH=./serviceAccountKey.json
- Service Account Security: Never commit your service account key to version control. Add to
.gitignore
:
serviceAccountKey.json
*-service-account.json
firebase-adminsdk.json
The package throws standard NestJS exceptions:
UnauthorizedException
: Invalid or missing token- Error initializing Firebase Admin SDK
- Invalid service account configuration
This package is written in TypeScript and includes type definitions. No additional @types
packages are required.
MIT
Made with β€οΈ by Reyco1