La firma de un JSON Web Token (JWT) es un proceso esencial para garantizar la autenticidad y la integridad de los datos que se transfieren en aplicaciones web. Utilizando la librería jsonwebtoken, podemos implementar un sistema de firmado en tres pasos fundamentales: definir el payload, elegir el algoritmo adecuado y firmar el token con un secret o clave privada. Esta implementación es crucial para proteger tus endpoints y garantizar la seguridad en la comunicación de datos.
¿Qué necesitamos para firmar un JWT?
Payload: Es el objeto JSON que contiene los Claim Names, como sub, name y exp. Utilizar la información del usuario verificado es vital para su correcta creación.
Secret o Private Key: Dependiendo del algoritmo de firmado:
Simétrico (HS256): Usa un secret.
Asimétrico (RS256): Usa una clave privada.
Opciones o callback function: Puede incluir configuraciones adicionales para el JWT.
Implementación práctica en Node.js
Construcción del payload
Antes de proceder al firmado, es vital estructurar correctamente el payload. A continuación, un ejemplo de cómo podría hacerse:
const user =/* Suponemos que el usuario está previamente definido y verificado */;const payload ={sub: user.id,// Subject suele ser el ID del usuarioname: user.full_name,// Usamos el nombre completo ya que no tenemos un campo 'name'exp:Math.floor(Date.now()/1000)+(60*1)// Expiración en 1 minuto};
Firmado del token
Para firmar el token, primero importamos la librería jsonwebtoken y luego utilizamos el método sign:
const jwt =require('jsonwebtoken');const secret = process.env.SECRET_KEY;// Una buena práctica es utilizar variables de entornoconst token = jwt.sign(payload, secret);
Recomendaciones para el manejo del secret
Asegúrate de que el secret sea un string aleatorio y largo.
Usa variables de entorno para almacenar el secret y otros datos sensibles.
Nunca expongas tu secret ni tu clave privada en el repositorio.
Prueba y verificación en Postman
Para comprobar que el servidor y los endpoint funcionan correctamente, primero verifica el acceso al endpoint público:
Realiza un request a public para confirmar que el servidor está funcionando.
Solicita al endpoint token para obtener el JWT firmado.
Evalúa el token recibido accediendo al endpoint privado.
Desafío para el lector: Implementa en otro lenguaje
Un gran ejercicio sería realizar esta misma implementación de firmado de un JWT en otro lenguaje de programación diferente a Node.js. Esto no solo te ayudará a ampliar tus habilidades, sino también a entender las diferencias entre las implementaciones en distintos entornos.
¡Anímate a poner en práctica tus conocimientos, explora nuevos lenguajes y sigue mejorando tus habilidades en la programación y seguridad de aplicaciones web!