Desarrollador 🔒 Se ejecuta en tu navegador — no se envían datos

Depurador de JWT

Un 401 con un token que parece correcto casi siempre se debe a una de seis cosas. Esta página te enseña el token tal como lo lee el servidor, para que descubras cuál es.

Token JWT
Secreto o clave pública
La clave se usa en tu navegador y no se envía a ningún sitio.
Decodificado
Cabecera

          
        
Payload

        
Firma

Firma un token propio para probar un endpoint. Todo se calcula en esta página.

Clave de firma

La clave y el token terminado se quedan en tu navegador: no se envían a ningún sitio y tampoco viajan en un enlace compartido.

Depurar un JSON Web Token que está siendo rechazado

Los tokens fallan de unas pocas maneras, y ninguna se ve en el token mismo: son tres trozos de Base64URL con puntos en medio. Pégalo aquí y se convierte en algo con lo que se puede discutir: cada campo de la cabecera y cada claim, en una tabla que dice para qué sirve cada uno, con la caducidad traducida a palabras claras y la firma comprobada contra la clave que tengas.

Se decodifica mientras escribes y no se envía a ningún sitio. En una página así conviene decirlo sin rodeos, porque lo que estás a punto de pegar es una credencial en funcionamiento de la cuenta de alguien.

Los seis fallos, en el orden que conviene

Qué ha falladoCómo se ve aquíSolución
CaducadoLa línea sobre la cabecera dice "Caducó…"Renueva el token; si va por segundos, revisa los relojes
Audiencia equivocadaaud nombra otra APIPide el token para la audiencia que espera la API
Emisor equivocadoiss es la URL de staging, no la de producciónApunta el cliente al emisor correcto, o la API al que toca
Clave equivocadaVerificar dice que la firma no coincideUsa la clave con la que firmó el emisor; ojo con los secretos en Base64
Algoritmo equivocadoLa cabecera dice ES256 y tu clave es RSAHaz que la clave encaje con el algoritmo que aparece junto al campo
No es un JWSLa página lo llama JWE, con cinco partesEl contenido está cifrado; léelo donde esté la clave de descifrado

El orden importa. La caducidad y la audiencia no necesitan clave ni la colaboración de nadie, así que se descartan en segundos; perseguir un problema de firma que acaba siendo un aud mal puesto es como se va una tarde entera.

Leer no es verificar

Esta es la distinción con la que más gente tropieza. Decodificar te dice lo que un token afirma; no dice nada sobre si eso es cierto, porque la cabecera y el payload están codificados, no cifrados, y cualquiera puede escribir los suyos. Verificar significa recalcular la firma con el secreto o la clave pública del emisor —cosa que esta página hace en tu navegador— y es el único paso que convierte una afirmación en un hecho.

Usa entonces la vista decodificada para formarte una hipótesis y el botón Verificar para ponerla a prueba, y no dejes nunca que una decisión de autorización en tu propio código se apoye en contenido decodificado. Para eso mismo está la pestaña Código, que imprime la comprobación del lado del servidor en ocho lenguajes. Si lo que te desconcierta es la codificación, la diferencia entre Base64 y Base64URL explica por qué un segmento de JWT no se puede pegar sin más en un decodificador de Base64 corriente.

Cosas que parecen problemas del token y no lo son

  • La palabra Bearer copiada junto al token, o un salto de línea traído de la terminal: ambos cambian la entrada que se firmó y rompen la firma.
  • Un token cortado por un visor de registros. El segmento de firma tiene una longitud fija por algoritmo, así que uno truncado falla siempre.
  • Dos servicios que comparten un secreto y uno de ellos lo guarda en Base64. Marca El secreto está en Base64 para reproducir ese lado.
  • Un kid que ya no existe porque el emisor rotó sus claves; el token está bien, lo que está caduco es el juego de claves.

Una vez descartado el token, los sospechosos que quedan están en el servidor: un middleware que no valida nunca, un reloj que se desvía, una caché con un juego de claves antiguo. Si necesitas un token en un estado conocido para probar cualquiera de esas cosas —caducado, vigente, firmado con una clave tuya—, el generador de JWT lo construye, y el comprobador de caducidad explica cómo lee un verificador los claims de tiempo.

Guías relacionadas