Tokens JWT en JavaScript (Node.js): guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Tokens JWT en JavaScript (Node.js)

\n\n

JSON Web Token (JWT) es un estándar abierto (RFC 7519) para crear tokens de acceso basados en JSON. JWT se utiliza ampliamente para la autenticación e intercambio de información entre el cliente y el servidor en aplicaciones web modernas con Node.js. En este artículo, analizaremos cómo trabajar con JWT en el entorno Node.js utilizando la popular biblioteca jsonwebtoken.

\n\n

¿Qué es JWT?

\n\n

JWT consta de tres partes separadas por puntos:

\n\n
    \n
  • Header — encabezado que contiene el tipo de token y el algoritmo de firma (por ejemplo, HS256 o RS256).
  • \n
  • Payload — carga útil donde se almacenan los datos (claims): identificador de usuario, rol, tiempo de vida del token, etc.
  • \n
  • Signature — firma creada a partir del header, payload y la clave secreta. La firma garantiza que el token no ha sido modificado.
  • \n
\n\n

Visualmente, JWT se ve así: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

\n\n

Instalación de la biblioteca jsonwebtoken

\n\n

Para trabajar con JWT en Node.js se utiliza el paquete jsonwebtoken. Instálelo a través de npm:

\n\n
npm install jsonwebtoken
\n\n

Después de la instalación, puede importar la biblioteca a su proyecto:

\n\n
const jwt = require('jsonwebtoken');
\n\n

Generación (firma) de un token JWT

\n\n

Para crear un token, use el método jwt.sign(). Acepta tres parámetros principales:

\n\n
    \n
  • payload — objeto con los datos que se codificarán en el token.
  • \n
  • secretOrPrivateKey — clave secreta (o clave privada para algoritmos RSA/ECDSA).
  • \n
  • options — objeto con opciones, por ejemplo, expiresIn para establecer el tiempo de vida del token.
  • \n
\n\n

Ejemplo de generación de token:

\n\n
const jwt = require('jsonwebtoken');\n\nconst payload = {\n  userId: 12345,\n  role: 'user'\n};\n\nconst secretKey = 'your-secret-key-here';\n\nconst token = jwt.sign(payload, secretKey, { expiresIn: '1h' });\n\nconsole.log('JWT generado:', token);
\n\n

En este ejemplo, el token será válido durante 1 hora. También puede especificar el tiempo en segundos (expiresIn: 3600) o en otros formatos, como '7d' (7 días) o '30m' (30 minutos).

\n\n

Verificación de un token JWT

\n\n

Para verificar la autenticidad del token, se utiliza el método jwt.verify(). Devuelve el payload decodificado si el token es válido, o lanza un error si el token ha expirado o la firma es incorrecta.

\n\n
const jwt = require('jsonwebtoken');\n\nconst token = 'eyJhbGciOiJIUzI1NiIs...'; // su token\nconst secretKey = 'your-secret-key-here';\n\ntry {\n  const decoded = jwt.verify(token, secretKey);\n  console.log('Datos decodificados:', decoded);\n} catch (err) {\n  console.error('Error de verificación:', err.message);\n}
\n\n

Si el token ha expirado, recibirá el error 'jwt expired'. Si la firma es incorrecta, recibirá 'invalid signature'.

\n\n

Decodificación sin verificación de firma

\n\n

A veces es necesario simplemente leer los datos del token sin verificar la firma (por ejemplo, para depuración). Para ello, use jwt.decode():

\n\n
const jwt = require('jsonwebtoken');\n\nconst token = 'eyJhbGciOiJIUzI1NiIs...';\nconst decoded = jwt.decode(token);\n\nconsole.log('Payload sin verificación:', decoded);
\n\n

Importante: jwt.decode() no verifica la firma, por lo tanto, no lo use para autenticación en producción.

\n\n

Middleware para Express con JWT

\n\n

En aplicaciones web con Express, JWT se usa a menudo para proteger rutas. Crearemos un middleware simple que verifica el token del encabezado <

Recommendations