Implementación de JSON Web Token para autenticación en NestJS
Clase 28 de 35 • Curso 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?
- Instalación de dependencias: Es necesario instalar paquetes especializados como nestjs-jwt y passport-jwt.
- 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).
- 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.
- Adaptación del endpoint de login: El endpoint retorna tanto la información permitida del usuario como el access token recién generado.
- 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.