Firmado de JSON Web Tokens con Librería JWT en Node.js

Clase 9 de 25Curso de OAuth 2.0 y OpenID Connect: Flujos de Autenticación y Casos de Estudio

Contenido del curso

Open Authorization 2.0

Resumen

Firmar un JSON Web Token (JWT) es uno de los pasos fundamentales para proteger endpoints en aplicaciones web. Comprender cómo se construye el payload, cómo se utiliza un secret y cómo la librería jsonwebtoken implementa el proceso de firmado permite crear sistemas de autenticación robustos y seguros.

¿Qué parámetros recibe el método de firmado de un JWT?

La librería jsonwebtoken expone un método llamado sign que acepta tres parámetros [0:15]:

  • Payload: el objeto JSON que contiene los claim names, es decir, la información que viajará dentro del token.
  • Secret o private key: depende del tipo de algoritmo de firmado. Si es simétrico (como HS-256) se usa un secret. Si es asimétrico (como RSA-256) se usa una private key.
  • Opciones o callback: configuraciones adicionales o una función callback cuando se necesite manejo asíncrono.

Esta estructura clara facilita la implementación y mantiene separada la lógica de datos, seguridad y configuración.

¿Cómo se construye el payload para firmar el token?

En el ejemplo práctico se trabaja con un servidor en Express que expone tres endpoints: public, private y token [1:10]. El firmado ocurre precisamente en el endpoint de token, dentro de una función llamada signToken.

¿Qué claims se incluyen en el payload?

El payload se arma con tres claims específicos [1:40]:

  • sub (subject): corresponde al ID del usuario, identifica de forma única a quien pertenece el token.
  • name: en este caso se toma del campo fullName del usuario.
  • exp (expiración): una marca de tiempo en el futuro que determina cuándo el token dejará de ser válido.

Para calcular la expiración se suma el tiempo actual más un intervalo definido. En el ejemplo se crea una variable que representa un minuto en milisegundos (60 * 1000) [2:40]. Aunque se podría escribir el número directamente, extraerlo en una variable mejora la legibilidad del código.

javascript const ONE_MINUTE_IN_MS = 60 * 1000;

const payload = { sub: user.id, name: user.fullName, exp: Date.now() + ONE_MINUTE_IN_MS };

¿De dónde viene la información del usuario?

El método getUser carga los datos desde variables de entorno en lugar de una base de datos [2:00]. La estructura del usuario incluye id, username, password y fullName. En un entorno real, este paso implica verificar la identidad del usuario contra una base de datos antes de generar el token.

¿Cómo se protege el secret y se ejecuta el firmado?

El secret se almacena en un archivo .env y se carga mediante variables de entorno [3:30]. Este archivo nunca debe subirse al repositorio, ya que exponer el secret comprometería toda la seguridad del sistema.

Una buena práctica es mantener un archivo .env.example que liste únicamente los nombres de las variables necesarias, sin valores reales [4:20]. Esto permite que otros desarrolladores sepan qué configurar sin revelar información sensible.

javascript import jwt from 'jsonwebtoken'; import dotenv from 'dotenv';

dotenv.config();

const secret = process.env.SECRET; const token = jwt.sign(payload, secret); return token;

Al levantar el servidor y hacer un request con Postman al endpoint token, se obtiene el JWT firmado correctamente [4:45]. Sin embargo, al intentar acceder al endpoint private, se produce un error porque la verificación aún no está implementada.

¿Qué consideraciones de seguridad hay que tener?

  • Si se usa HS-256 (algoritmo simétrico), el secret debe ser un string aleatorio, idealmente de 256 bits [3:50].
  • Si se usa RSA-256 (algoritmo asimétrico), la llave privada nunca debe exponerse.
  • Las variables de entorno son el lugar adecuado para almacenar estos valores sensibles.

El reto propuesto es implementar el firmado de un JWT en un lenguaje diferente a Node.js [5:40]. Es una oportunidad perfecta para experimentar con un lenguaje nuevo sin necesidad de un proyecto complejo. ¿Con qué lenguaje te animarías a probarlo? Comparte tu experiencia en los comentarios.

      Firmado de JSON Web Tokens con Librería JWT en Node.js