Tokens JWT en JavaScript (Node.js)
\n\nJSON 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.
¿Qué es JWT?
\n\nJWT 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
Visualmente, JWT se ve así: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Instalación de la biblioteca jsonwebtoken
\n\nPara trabajar con JWT en Node.js se utiliza el paquete jsonwebtoken. Instálelo a través de npm:
npm install jsonwebtoken\n\nDespués de la instalación, puede importar la biblioteca a su proyecto:
\n\nconst jwt = require('jsonwebtoken');\n\nGeneración (firma) de un token JWT
\n\nPara crear un token, use el método jwt.sign(). Acepta tres parámetros principales:
- \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,
expiresInpara establecer el tiempo de vida del token. \n
Ejemplo de generación de token:
\n\nconst 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\nEn 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).
Verificación de un token JWT
\n\nPara 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.
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\nSi el token ha expirado, recibirá el error 'jwt expired'. Si la firma es incorrecta, recibirá 'invalid signature'.
Decodificación sin verificación de firma
\n\nA veces es necesario simplemente leer los datos del token sin verificar la firma (por ejemplo, para depuración). Para ello, use jwt.decode():
const jwt = require('jsonwebtoken');\n\nconst token = 'eyJhbGciOiJIUzI1NiIs...';\nconst decoded = jwt.decode(token);\n\nconsole.log('Payload sin verificación:', decoded);\n\nImportante: jwt.decode() no verifica la firma, por lo tanto, no lo use para autenticación en producción.
Middleware para Express con JWT
\n\nEn aplicaciones web con Express, JWT se usa a menudo para proteger rutas. Crearemos un middleware simple que verifica el token del encabezado <
También en la biblioteca
Bibliotecas WebSocket de Swift: Starscream y URLSessionWebSocketTask
Generación de PDF en JavaScript (Node.js): bibliotecas y herramientas
Geolocalización y mapas en TypeScript: bibliotecas y ejemplos prácticos
Dapper para C# (.NET): guía completa con ejemplos