Resumen

¿Cómo verificar un JSON Web Token?

La verificación de un JSON Web Token (JWT) es un paso crucial para asegurar la autenticidad y seguridad de las comunicaciones. Utilizando una librería especial, podemos comprobar si el token que recibimos ha sido firmado correctamente y no ha sido alterado. Aquí te explicamos el proceso detallado y simplificado para verificar un JWT en Node.js.

¿Qué necesitamos?

  • Un JSON Web Token en formato de serialización compacta, que es una cadena de tres partes codificadas en base 64, separadas por puntos.
  • Un secreto compartido o una llave pública, dependiendo del tipo de algoritmo de firmado (simétrico o asimétrico).
  • La librería adecuada para manejar JWT.

¿Cómo se verifica un token?

  1. Obtener el Token: Recibe el token desde el header de una solicitud HTTP en el endpoint correspondiente.
  2. Verificar el Token:
    • Usa la librería de JWT para verificar la firma del token pasándole el token y el secreto o llave pública.
    • Esta operación comprueba si el token es válido y no ha expirado.
// Ejemplo de cómo verificar un token en Node.js
const jwt = require('jsonwebtoken');

// Token y secreto
const token = 'your-jwt-token';
const secret = 'your-secret';

// Verificación
jwt.verify(token, secret, (err, decoded) => {
  if (err) {
    console.error('Error al verificar el token:', err.message);
  } else {
    console.log('Token verificado:', decoded);
  }
});

¿Cómo podemos implementar un firmado asimétrico?

El firmado asimétrico utiliza un par de llaves: una privada para firmar el token y una pública para verificarlo. Esto añade un nivel extra de seguridad, ya que la llave privada nunca se expone.

Pasos para la implementación:

  1. Generación de llaves: Crea un par de llaves con una herramienta como OpenSSL. Las llaves deben estar en formato PKCS8.
  2. Cargar la llave privada: Usa filesystem de Node.js para leer tu llave privada desde un archivo.
const fs = require('fs');
const privateKey = fs.readFileSync('path/to/private.pem', 'utf8');

// Firmado del token
const signOptions = { algorithm: 'RS256' };
const token = jwt.sign(payload, privateKey, signOptions);
  1. Verificar el token con la llave pública: Similar al método de firmado simétrico, pero usando la llave pública.
const publicKey = fs.readFileSync('path/to/public.pem', 'utf8');

// Verificación
jwt.verify(token, publicKey, (err, decoded) => {
  if (err) {
    console.error('Error al verificar token asimétrico:', err.message);
  } else {
    console.log('Token verificado:', decoded);
  }
});

¿Qué consideraciones de seguridad debemos tener?

  • Llave Pública: Es segura para exponer, ya que su propósito es verificar la firma.
  • Llave Privada: Debe mantenerse segura y nunca alojarse en lugares accesibles públicamente.
  • Secretos: Si usas un algoritmo simétrico, mantén el secreto bien protegido y nunca lo compartas ni lo expongas.

Desafíos prácticos

Para profundizar más, se te anima a implementar el proceso de verificación de JWT en otro lenguaje distinto a Node.js. Este ejercicio te permitirá entender mejor los principios de la criptografía involucrados y mejorar tus habilidades multiplataforma.

¡Continúa explorando y aprendiendo más sobre autenticación segura! Este conocimiento es clave para construir aplicaciones más robustas y seguras.