Aplicar Seguridad a aplicaciones NestJS, usando JWT, Passport y Guards
La seguridad es un aspecto fundamental en cualquier aplicación moderna. En este blog aprenderemos a proteger nuestras rutas en NestJS utilizando Passport, JWT y Guards.
¿Qué es NestJS?
NestJS es un framework progresivo de Node.js para construir aplicaciones eficientes y escalables del lado del servidor. Se basa en TypeScript y aprovecha conceptos como la inyección de dependencias, programación modular y desarrollo orientado a decoradores.
¿Qué es JWT?
JWT (JSON Web Token) es un estándar abierto (RFC 7519) que define un método compacto y seguro para representar información entre dos partes mediante un objeto JSON.
Características principales:
- Un JWT contiene datos ("claims") que pueden ser verificados y confiables porque están firmados digitalmente.
- Normalmente se utiliza para autenticación y autorización en sistemas distribuidos.
-
Su estructura tiene tres partes codificadas en Base64:
- Header: información sobre el algoritmo de firma.
- Payload: los datos o claims.
- Signature: la firma que asegura la integridad del token.
La estructura será:
xxxxx.yyyyy.zzzzz
¿Qué es Passport?
Passport es un middleware de autenticación extremadamente popular para aplicaciones Node.js.
Características principales:
- Modular: utiliza un sistema de estrategias para autenticar peticiones (por ejemplo, login local, JWT, OAuth2, Google, Facebook, etc.).
- Minimalista: no asume cómo debes gestionar sesiones o usuarios, te da solo las herramientas necesarias.
- Fácil de integrar: puede trabajar con Express, NestJS u otros frameworks basados en Node.js.
Funciona así:
- Al recibir una solicitud, Passport ejecuta una estrategia (por ejemplo, verificar el usuario y contraseña o validar un JWT).
- Si la autenticación es exitosa, Passport adjunta los datos del usuario autenticado al objeto request (req.user).
- Si falla, puede lanzar errores o bloquear la petición automáticamente.
En resumen:
- Passport = "¿Cómo voy a autenticar?"
- JWT = "¿Qué información voy a usar para demostrar que estoy autenticado?"
¿Qué vamos a construir?
Implementaremos un sistema de autenticación JWT sencillo:
- Registro e inicio de sesión de usuarios.
- Generación de un token JWT al iniciar sesión.
- Protección de rutas usando Guards personalizados.
Instalando dependencias:
Primero, crea un nuevo proyecto NestJS:
nest new auth-jwt-example
npm install @nestjs/passport passport passport-jwt @nestjs/jwt
npm install --save-dev @types/passport-jwt
Configurando Passport y JWT:
Primero, crea un AuthModule:
nest g module auth
Y un servicio para manejar la autenticación:
nest g service auth
También, genera un controller:
nest g controller auth
AuthService:
AuthController:
LocalStrategy:
Passport necesita estrategias. Creamos una LocalStrategy:
Configurando JWT Strategy:
Creando Guards:
Un Guard es quien decide si una petición pasa o no.
- Creamos un guard para JWT:
- Y un guard para login local:
Protegiendo rutas:
Ahora, supongamos que tienes un controller de usuarios:
Resultado:
Para acceder a /users/profile
, necesitas enviar el access_token
generado al hacer login en el encabezado Authorization, de lo contrario el servicio no responderá.
Authorization: Bearer tu_token_jwt
Conclusión
Con NestJS, Passport y JWT podemos construir un sistema de autenticación robusto y seguro de manera muy estructurada. El uso de Guards permite separar la lógica de autorización de la lógica de negocio, manteniendo el código limpio y escalable.
¿ Quieres conocer más ?
¡ Agenda una llamada !
¡ Contáctanos en WhatsApp