12 septiembre, 2024

Integrando Firebase Authentication en NestJS con nestjs-firebase-auth

Integrando Firebase Authentication en NestJS con nestjs-firebase-auth

Gestionar la autenticación en una aplicación web moderna puede ser complicado, especialmente cuando se trabaja con varios proveedores de identidad y se asegura el acceso a los endpoints. Firebase Authentication simplifica este proceso proporcionando una autenticación robusta, y NestJS ofrece un marco potente para construir aplicaciones escalables.

En este post, te presentaré @alpha018/nestjs-firebase-auth, una librería diseñada para hacer que la integración de Firebase Authentication en NestJS sea sencilla y flexible. Ya sea que necesites una autenticación básica o un control de acceso basado en roles (RBAC) utilizando las reclamaciones personalizadas de Firebase, esta librería tiene todo lo que necesitas.

¿Qué hace nestjs-firebase-auth?

Esta librería extiende las capacidades de autenticación de NestJS utilizando el Firebase Admin SDK y la estrategia de Passport. Proporciona una variedad de herramientas que facilitan:

  • Autenticar usuarios mediante tokens de Firebase.
  • Validar roles de usuario utilizando las reclamaciones personalizadas de Firebase.
  • Personalizar la extracción de tokens y gestionar tokens revocados.
  • Proteger rutas con un código mínimo.

Instalación

Para comenzar, instala el paquete junto con el SDK de Firebase Admin:

npm i @alpha018/nestjs-firebase-auth firebase-admin

También necesitarás configurar Firebase en tu proyecto descargando la clave de cuenta de servicio desde tu consola de Firebase.

Características y Componentes Principales

1. Configuración del Módulo

El FirebaseAdminModule te permite configurar Firebase para tu aplicación NestJS. Puedes pasar una cadena codificada en base64 con la cuenta de servicio JSON o usar opciones normales para configurar Firebase.


import { Module } from '@nestjs/common';
import { FirebaseAuthGuard, FirebaseAdminModule } from '@alpha018/nestjs-firebase-auth';
import { ConfigModule, ConfigService } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot(),
    FirebaseAdminModule.forRootAsync({
      imports: [ConfigModule],
      useFactory: (configService: ConfigService) => ({
        base64: configService.get('FIREBASE_SERVICE_ACCOUNT_BASE64'),
        options: {}, // Opcionalmente, proporciona la configuración de Firebase aquí
        auth: {
          config: {
            extractor: ExtractJwt.fromAuthHeaderAsBearerToken(), // Extraer JWT del header
            checkRevoked: true, // Opcionalmente verifica si el token fue revocado
            validateRole: true, // Habilita la validación de roles si es necesario
          },
        },
      }),
      inject: [ConfigService],
    }),
  ],
})
export class AppModule {}
    

2. Guards de Autenticación y Validación de Roles

El FirebaseAuthGuard es el núcleo para asegurar tus endpoints. Puedes usarlo para proteger rutas y validar tokens de usuario. Si tu aplicación requiere control de acceso basado en roles, la librería integra las reclamaciones personalizadas de Firebase para hacer cumplir el RBAC de manera sencilla.

Proteger Rutas Sin Validación de Roles

Si solo necesitas autenticación básica, el FirebaseAuthGuard garantizará que solo los usuarios autenticados puedan acceder a tus rutas.


import { Controller, Get, UseGuards } from '@nestjs/common';
import { FirebaseAuthGuard } from '@alpha018/nestjs-firebase-auth';

@Controller()
export class AppController {
  @UseGuards(FirebaseAuthGuard)
  @Get()
  getProtectedData(): string {
    return '¡Esta ruta está protegida por Firebase Auth!';
  }
}
    

Control de Acceso Basado en Roles (RBAC)

Para casos de uso más avanzados, puedes usar las reclamaciones personalizadas de Firebase para implementar acceso basado en roles. La librería permite configurar y validar estos roles fácilmente.


import { Controller, Get } from '@nestjs/common';
import { FirebaseProvider } from '@alpha018/nestjs-firebase-auth';

enum Roles {
  ADMIN = 'ADMIN',
  USER = 'USER',
}

@Controller()
export class AppController {
  constructor(private readonly firebaseProvider: FirebaseProvider) {}

  @Get('/set-role')
  async setAdminRole() {
    await this.firebaseProvider.setClaimsRoleBase('FirebaseUID', [Roles.ADMIN]);
    return { status: '¡Rol de administrador asignado!' };
  }
}
    

3. Extracción de Tokens y Reclamaciones

La librería facilita la obtención de los detalles y reclamaciones de los usuarios a partir de los tokens de Firebase. Usando los decoradores @FirebaseUser() y @FirebaseUserClaims(), puedes extraer información importante del usuario autenticado.


import { Controller, Get } from '@nestjs/common';
import { FirebaseUser, FirebaseUserClaims } from '@alpha018/nestjs-firebase-auth';
import { auth } from 'firebase-admin';

@Controller()
export class AppController {
  @Get('/user-info')
  getUserInfo(
    @FirebaseUser() user: auth.DecodedIdToken,
    @FirebaseUserClaims() claims: string[],
  ) {
    return { user, claims };
  }
}

4. Gestión de Revocación de Tokens

Firebase admite la revocación de tokens, lo que te permite invalidar tokens después de haber sido emitidos. Esto es útil en casos de seguridad, como cuando un usuario ha sido comprometido. Puedes configurar el guard para verificar automáticamente si los tokens fueron revocados habilitando checkRevoked.


@Module({
  imports: [
    ConfigModule.forRoot(),
    FirebaseAdminModule.forRootAsync({
      imports: [ConfigModule],
      useFactory: (configService: ConfigService) => ({
        base64: configService.get('FIREBASE_SERVICE_ACCOUNT_BASE64'),
        auth: {
          config: {
            checkRevoked: true, // Ensure revoked tokens are invalidated
          },
        },
      }),
      inject: [ConfigService],
    }),
  ],
})

¿Por qué usar nestjs-firebase-auth?

La ventaja de esta librería es su simplicidad y flexibilidad. Con pocas configuraciones, puedes tener un sistema de autenticación robusto listo para funcionar. Ya sea que estés construyendo un proyecto pequeño o escalando con necesidades de seguridad más complejas, nestjs-firebase-auth te proporciona todas las herramientas necesarias.

Beneficios clave incluyen:

  • Integración sin esfuerzo con Firebase: Aprovecha todo el poder de Firebase Auth dentro de NestJS.
  • Control de Acceso Basado en Roles: Protege tus rutas con reclamaciones personalizadas y gestiona roles fácilmente.
  • Soporte para Revocación de Tokens: Maneja automáticamente tokens revocados para mantener tu app segura.
  • Extractores de Tokens Personalizados: Flexibilidad en cómo extraes y validas tokens en las solicitudes.

Conclusión

Si estás buscando agregar Firebase Authentication a tu proyecto NestJS, nestjs-firebase-auth es la librería perfecta para comenzar de manera rápida y segura. Simplifica el proceso de agregar autenticación y validación de roles, haciendo que tu API sea más segura con una configuración mínima.

Si deseas más detalles y ver la documentación completa, visita el repositorio en GitHub. ¡Estaría encantado de recibir tus comentarios y contribuciones!

¡Happy Coding!

Add Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *