Autenticación con Passport.js en Nest.js: Estrategias Locales
Clase 9 de 22 • Curso de NestJS: Autenticación con Passport y JWT
Contenido del curso
- 11

Implementación de JSON Web Tokens en APIs para Autenticación Segura
09:42 - 12

Implementación de JWT en Módulo de Autenticación con Variables de Entorno
17:15 - 13

Estrategia y Guardia de Autenticación con JWT en NestJS
16:38 - 14

Extensión de Guardianes JWT en NestJS para Endpoints Públicos
12:39 - 15

Control de Roles y Permisos con JSON Web Tokens en TypeScript
23:08 - 16
Creación de Endpoints Seguros con JWT en NestJS
02:13
- 17

Configuración y Despliegue de MongoDB Atlas en Heroku
06:24 - 18

Configuración de Variables de Entorno en Heroku para MongoDB
16:25 - 19

Configuración de PostgreSQL en Heroku para Node.js
07:32 - 20

Configuración de Conexiones a Base de Datos en Heroku y Entorno Local
11:24 - 21

Migraciones con TimeORM en Producción: Configuración y Ejecución
20:41
¿Cómo integrar Passport.js con NestJS para la autenticación?
Para añadir autenticación robusta a nuestras aplicaciones NestJS, Passport.js es la opción ideal. Este módulo se integra fácilmente en la estructura de Nest.js, y ofrece varias estrategias de autenticación. La documentación oficial de Nest.js sugiere usar un módulo especializado de Passport para facilitar esta integración.
¿Qué librerías debemos instalar?
Para comenzar con la autenticación, necesitamos instalar varias librerías. Aquí está el paso a paso para integrar Passport.js en nuestro proyecto Nest.js:
- Módulo de Passport para NestJS: Nos ofrece un puente entre Passport.js y la estructura de módulos de Nest.js.
- Librería passport: Herramienta base para la autenticación.
- Estrategia local para Passport: Para autenticar con usuario y contraseña.
- Tipado para la estrategia local: Asegura que el tipado esté acorde con las funciones de autenticación.
En la terminal, ejecutamos la siguiente línea para instalar estas librerías:
$ npm install @nestjs/passport passport passport-local
$ npm install -D @types/passport-local
¿Cómo creamos un servicio de autenticación?
Con las librerías instaladas, creamos un servicio de autenticación. Usaremos el generador de Nest.js:
$ nest generate service auth
Ubicaremos nuestro servicio dentro del módulo adecuado y lo configuraremos para importar UserService. Este servicio se encargará de verificar a los usuarios basándose en su email:
import { Injectable } from '@nestjs/common';
import { UserService } from '../user/user.service';
@Injectable()
export class AuthService {
constructor(private userService: UserService) {}
async validateUser(email: string, password: string): Promise<any> {
const user = await this.userService.findByEmail(email);
if (user && user.password === password) {
return user;
}
return null;
}
}
¿Cómo verificamos credenciales de usuario?
Al crear el método validateUser, compararemos las credenciales proporcionadas con las almacenadas en la base de datos utilizando técnicas seguras. Aquí usamos bcrypt para comparar contraseñas cifradas:
import * as bcrypt from 'bcrypt';
async validateUser(email: string, password: string): Promise<any> {
const user = await this.userService.findByEmail(email);
if (user && await bcrypt.compare(password, user.password)) {
return user;
}
return null;
}
¿Qué es una strategy en Passport.js?
Una strategy define cómo autenticar usuarios. Passport.js diversifica sus estrategias para diferentes placas, como Local, JWT, OAuth, entre otras.
¿Cómo creamos una estrategia local?
Ubicamos la strategy en una nueva carpeta strategies dentro de nuestro módulo:
import { Strategy } from 'passport-local';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { AuthService } from './auth.service';
@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
constructor(private authService: AuthService) {
super();
}
async validate(email: string, password: string): Promise<any> {
const user = await this.authService.validateUser(email, password);
if (!user) {
throw new UnauthorizedException();
}
return user;
}
}
¿Cómo integramos el módulo de Passport en el módulo de autenticación?
El último paso es asegurar que el módulo de autenticación integre todas las piezas correctamente. Importamos el PassportModule y registramos la estrategia local:
import { Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { AuthService } from './auth.service';
import { LocalStrategy } from './strategies/local.strategy';
import { UserModule } from '../user/user.module';
@Module({
imports: [
UserModule,
PassportModule.register({ defaultStrategy: 'local' }),
],
providers: [AuthService, LocalStrategy],
})
export class AuthModule {}
Con esto, hemos implementado la base para autenticación utilizando Passport.js y NestJS. Cada paso que sigues te acerca más a crear una aplicación segura. ¡No olvides explorar más estrategias para seguir mejorando!