Implementación de JSON Web Token para autenticación en NestJS

Clase 28 de 35Curso de Backend con NestJS

Resumen

Contar con un sistema de login confiable es esencial, pero no suficiente por sí solo. Para proteger los endpoints y permitir un acceso autorizado en aplicaciones web, móviles o de escritorio, la implementación de JSON Web Token (JWT) es clave. A continuación, verás cómo se realiza esta integración, por qué es tan relevante y cuáles son las mejores prácticas para asegurar tus datos.

¿Por qué usar JSON Web Token para autenticación y autorización?

El login tradicional basado en cookies solo es útil para aplicaciones web, ya que sus métodos de sesión no funcionan en entornos móviles o de escritorio. Por eso, JWT se convierte en la modalidad estándar, ya que facilita autenticación multiplataforma y permite conectividad segura con diversos sistemas. Usar JWT garantiza flexibilidad y escalabilidad, integrándose perfectamente con arquitecturas modernas.

¿Cómo funciona un JSON Web Token y qué información contiene?

Un JSON Web Token está compuesto usualmente por tres partes: payload, encabezado y firma. Dentro del payload es común encontrar identificadores como el sub (ID del usuario), fechas de expiración y, en algunos ejemplos, roles o nombre de usuario. Sin embargo, no se recomienda almacenar información sensible como emails o privilegios de administrador, ya que cualquiera con acceso al token puede descifrar su contenido. Lo esencial es incluir únicamente un identificador (primary key) y dejar los datos sensibles fuera del token, consultándolos solo desde la base de datos cuando sea necesario.

  • La firma es generada con un secreto al que solo el backend debe acceder.
  • Si alguien intenta verificar la autenticidad del token sin el secreto correcto, la firma será inválida.
  • Solo el backend legítimo puede validar si el token es original y seguro.

¿Cuáles son los pasos clave para implementar JWT en NestJS y proteger las rutas?

  1. Instalación de dependencias: Es necesario instalar paquetes especializados como nestjs-jwt y passport-jwt.
  2. Configuración en el módulo de autenticación: Se importa JWT Module al módulo de autenticación, definiendo el secreto y tiempo de expiración del token (ejemplo: seis días).
  3. Creación de un método para generar el token: Se desarrolla un método generateToken, el cual recibe el usuario autenticado y genera el JWT usando solo el sub.
  4. Adaptación del endpoint de login: El endpoint retorna tanto la información permitida del usuario como el access token recién generado.
  5. Protección avanzada del secreto: En vez de colocar el secreto directamente en el código, se emplea una variable de ambiente tipo JWT_SECRET, protegida y fuera del alcance público. Se recomienda especificar en archivos ejemplo (.env.example) las variables requeridas, sin exponer su valor.

¿Qué buenas prácticas existen al manejar el secreto y la validez del token?

  • Nunca expongas el secreto en el código fuente.
  • Solo personal autorizado o procesos internos deben conocer la clave usada para firmar los tokens.
  • Manejar el secreto mediante variables de ambiente asegura que el valor real no se incluya en los repositorios ni archivos compartidos.
  • Renovar el token periódicamente y usar estrategias de refresh puede fortalecer la seguridad.

¿Ya utilizas JWT en tus proyectos? Comparte tus experiencias o dudas en los comentarios y sigue aprendiendo sobre la protección de tus aplicaciones.