Decodificar un JWT
Un JWT parece legible en cuanto lo pega en cualquier decodificador — así fue diseñado el formato — pero leer el encabezado y el payload no dice nada sobre si el token es genuino. Esta API separa ambas tareas: decodifica los claims al instante y, aparte, confirma si la firma realmente se emitió con su clave, y no solo se copió de un token que parecía legítimo.
Ejecutar — gratis
Corre en su navegador. Gratis y sin límite: sus datos no salen de esta página.
Decodificar y verificar son dos preguntas distintas
Como un JSON Web Token solo está codificado en base64url, no cifrado, cualquiera puede pegar la sección central en la consola del navegador y leer los claims; eso no requiere ningún secreto ni demuestra nada. La verificación es la pregunta real: ¿coincide la firma con lo que su emisor habría producido con su clave privada o compartida? Confundir ambas cosas es una fuente común de errores de autenticación, y por eso este endpoint las trata como entradas separadas y explícitas.
Cómo funciona la solicitud
Envíe POST /dev/jwt-decode con el token y, si quiere verificación de firma, el secreto correspondiente (para HS256) o la clave pública (para RS256/ES256). La tarea corre de forma asíncrona y devuelve un task_id de inmediato; el encabezado decodificado, los claims del payload, el estado de expiración y un veredicto claro de firma válida o inválida llegan por webhook firmado o por un enlace firmado disponible durante 24 horas.
El origen del formato, en breve
Los JWT se estandarizaron en el RFC 7519 en 2015 para darle a los sistemas distribuidos una forma compacta y autocontenida de pasar claims entre partes sin ir y volver a un almacén central de sesiones. Esa característica sin estado también es su principal trampa: un token que se decodifica sin problemas puede estar expirado, emitido por la parte equivocada o firmado con un algoritmo que su servicio nunca debería aceptar, por lo que decodificar solo nunca debe confundirse con autenticar.
Dónde lo usan los equipos
Este endpoint se llama desde herramientas de depuración que necesitan inspeccionar el token de un cliente durante un ticket de soporte, desde servicios backend que validan tokens emitidos por un proveedor de identidad externo, desde suites de pruebas que verifican que claims como exp, aud y role estén correctos, y desde pipelines de logs que necesitan extraer un ID de usuario de un access token sin levantar toda la capa de autenticación.
Qué llega de vuelta
La respuesta separa el encabezado, el payload y el resultado de verificación para que su código nunca tenga que adivinar qué parte es cuál. Los tokens malformados, las claves faltantes o los algoritmos no soportados devuelven un error claro en lugar de un fallo silencioso, y como las tareas fallidas nunca se cobran, puede probar entradas malformadas durante la depuración sin preocuparse por el costo.
Qué puede hacer con ella
Depuración de tickets de soporte
Pegue el token expirado o rechazado de un cliente para ver sus claims exactos y su expiración sin escribir un script desechable.
Validación de tokens entre servicios
Verifique tokens emitidos por un proveedor de identidad externo antes de que su backend confíe en los claims que contienen.
Aserciones automatizadas en pruebas
Compruebe en CI que los tokens emitidos llevan los claims correctos de audience, issuer y role antes de publicar un release.
Enriquecimiento de logs y analítica
Extraiga un ID de usuario o de tenant de un access token durante el procesamiento de logs sin cargar una librería de autenticación completa.
Preguntas frecuentes
¿Decodificar un JWT requiere la clave secreta?
No, leer el encabezado y el payload solo requiere el token; el secreto o la clave pública únicamente se necesitan si además quiere verificar la firma.
¿Qué algoritmos de firma puede verificar este decodificador de JWT?
HS256 con secreto compartido, y RS256 o ES256 con clave pública, lo que cubre los algoritmos que emiten por defecto la mayoría de los proveedores de identidad.
¿Es gratuita la API para decodificar JWT?
La herramienta de arriba es gratis en su navegador. La API es de pago: cada llamada se descuenta de su saldo prepago de ForHosting KIT — se recarga desde $10.00 (no caduca), se paga el precio publicado de cada solicitud, y una llamada sin saldo devuelve HTTP 402. Sin suscripción, sin tokens, y una tarea fallida no se cobra.
¿Cuánto cuesta decodificar o verificar un token?
$0.002 por solicitud, ya sea que solo decodifique los claims o también verifique la firma, y las tareas fallidas nunca se cobran.
¿Puede indicarme si mi token ya expiró?
Sí, la respuesta incluye el estado de expiración junto con los claims decodificados, así que no necesita calcularlo usted mismo a partir del campo exp.
¿Es seguro enviar tokens de producción a esta API?
Los tokens y las claves se usan solo para procesar esa solicitud puntual y se eliminan después del período de retención, nunca se usan para entrenar modelos.
¿Qué pasa con un token malformado o truncado?
La API devuelve un error claro y específico que indica qué parte no se pudo analizar, en lugar de un fallo genérico.
¿Cómo se entrega el resultado?
Por webhook firmado, recomendado para flujos automatizados, o por un enlace firmado que permanece válido durante 24 horas.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, y pronto desde nuestra app, el email y Telegram.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/dev/jwt-decode \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"items":["valor-1","valor-2"]}'const res = await fetch("https://api.kit.forhosting.com/dev/jwt-decode", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"items": [
"valor-1",
"valor-2"
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/jwt-decode",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"items": [
"valor-1",
"valor-2"
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/jwt-decode", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"items":["valor-1","valor-2"]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"items":["valor-1","valor-2"]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/jwt-decode", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"items": [
"valor-1",
"valor-2"
]
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.jwt_decode",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |