Aplicar Seguridad a aplicaciones NestJS, usando JWT, Passport y Guards

By: Freddy Manuel Sabogal

Seguridad Información


blog/ Aplicar Seguridad a aplicaciones NestJS, usando JWT, Passport y Guards
01 junio 2021


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?"

nestpassport


¿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:


authservice


AuthController:


authcontroller


LocalStrategy:


Passport necesita estrategias. Creamos una LocalStrategy:

localstrategy


Configurando JWT Strategy:


jwtstrategy


Creando Guards:


Un Guard es quien decide si una petición pasa o no.

  • Creamos un guard para JWT:

jwtauthguard

  • Y un guard para login local:

localauthguard


Protegiendo rutas:


Ahora, supongamos que tienes un controller de usuarios:

userscontrollers

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