Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/tfarras/nestjs-firebase-auth
Firebase Authentication Strategy for NestJS Passport Integration
https://github.com/tfarras/nestjs-firebase-auth
firebase nestjs typescript
Last synced: 2 days ago
JSON representation
Firebase Authentication Strategy for NestJS Passport Integration
- Host: GitHub
- URL: https://github.com/tfarras/nestjs-firebase-auth
- Owner: tfarras
- Created: 2020-04-11T20:38:56.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2024-03-05T07:41:56.000Z (8 months ago)
- Last Synced: 2024-10-29T23:04:54.750Z (16 days ago)
- Topics: firebase, nestjs, typescript
- Language: TypeScript
- Homepage:
- Size: 13.7 KB
- Stars: 68
- Watchers: 2
- Forks: 25
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
Awesome Lists containing this project
README
#
NestJS Passport Strategy for Firebase Auth using Firebase Admin SDK
# Installation
## Install peer dependencies
```bash
npm install passport passport-jwt
npm install --save-dev @types/passport-jwt
```## Install `@nestjs/passport` for authentication
```bash
npm install @nestjs/passport
```## Install strategy
```bash
npm install @tfarras/nestjs-firebase-auth
```# Important
To work with Firebase Auth you need to configure and initialize your firebase app. For this purpose you can use my [module for firebase-admin](https://github.com/tfarras/nestjs-firebase-admin).
# Create strategy
```typescript
import { Injectable } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import { ExtractJwt } from 'passport-jwt';
import { FirebaseAuthStrategy } from '@tfarras/nestjs-firebase-auth';@Injectable()
export class FirebaseStrategy extends PassportStrategy(FirebaseAuthStrategy, 'firebase') {
public constructor() {
super({
extractor: ExtractJwt.fromAuthHeaderAsBearerToken(),
});
}
}
```Note: You should provide an extractor. More information about passport-jwt extractors you can find here: [http://www.passportjs.org/packages/passport-jwt/#included-extractors](http://www.passportjs.org/packages/passport-jwt/#included-extractors)
# Create `AuthModule` and provide created strategy
```typescript
import { Module } from "@nestjs/common";
import { PassportModule } from "@nestjs/passport";
import { FirebaseStrategy } from "./firebase.strategy";@Module({
imports: [PassportModule],
providers: [FirebaseStrategy],
exports: [FirebaseStrategy],
controllers: [],
})
export class AuthModule { }
```# Import `AuthModule` into `AppModule`
```typescript
import { FirebaseAdminCoreModule } from '@tfarras/nestjs-firebase-admin';
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from 'nestjs-config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { AuthModule } from './auth/auth.module';
import * as path from 'path';@Module({
imports: [
ConfigModule.load(path.resolve(__dirname, 'config', '**', '!(*.d).{ts,js}')),
FirebaseAdminCoreModule.forRootAsync({
useFactory: (config: ConfigService) => config.get('firebase'),
inject: [ConfigService],
}),
AuthModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule { }```
# Protect your routes
```typescript
import { Controller, Get, Inject, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { FirebaseAdminSDK, FIREBASE_ADMIN_INJECT } from '@tfarras/nestjs-firebase-admin';
import { AppService } from './app.service';@Controller()
export class AppController {
constructor(
private readonly appService: AppService,
@Inject(FIREBASE_ADMIN_INJECT) private readonly fireSDK: FirebaseAdminSDK,
) { }@Get()
@UseGuards(AuthGuard('firebase'))
getHello() {
return this.fireSDK.auth().listUsers();
}
}```
# Custom second validation
In cases when you want to validate also if user exists in your database, or anything else after successfull Firebase validation you can define custom `validate` method in your strategy.
## Example
```typescript
import { Injectable } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import { FirebaseAuthStrategy, FirebaseUser } from '@tfarras/nestjs-firebase-auth';
import { ExtractJwt } from 'passport-jwt';@Injectable()
export class FirebaseStrategy extends PassportStrategy(FirebaseAuthStrategy, 'firebase') {
public constructor() {
super({
extractor: ExtractJwt.fromAuthHeaderAsBearerToken(),
});
}async validate(payload: FirebaseUser): Promise {
// Do here whatever you want and return your user
return payload;
}
}
```