Con esa historia y algunos estándares como base, ¿cómo podemos procesar el JWT desde arriba y qué información contiene?
El JWT anterior consta de tres partes, separadas cada una por un punto (‘.’):
- Encabezado:: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
- Carga útil: eyJzdWIiOiIxMjM0NTY3ODkwQUJDIiwibmFtZSI6IkhlbnJpayBMb2VzZXIiLCJpYXQiOjE2MTExNDA0MDAsImV4cCI6MTYxMTIzNDU2N30
- Firma: _iVbBcypdse-9sjrxp9iOrGsXKBWrBB3mrHgBtukcfM
Tanto el encabezado como la carga útil están codificados en base64url y, sin tener en cuenta el posible relleno, se pueden decodificar así:
henrik@home> base64 -d <<< eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
{"alg":"HS256","typ":"JWT"}
henrik@home> base64 -d <<< eyJzdWIiOiIxMjM0NTY3ODkwQUJDIiwibmFtZSI6IkhlbnJpayBMb2VzZXIiLCJpYXQiOjE2MTExNDA0MDAsImV4cCI6MTYxMTIzNDU2N30
{"sub":"1234567890ABC","name":"Henrik Loeser","iat":1611140400,"exp":1611234567}base64: invalid input
El encabezado contiene información sobre el alg(oritmo) utilizado, aquí, HS256 (HMAC SHA256). La carga útil depende del tipo de token (acceso/actualización/ID/…) y se compone de reclamaciones. Esos y otros campos predefinidos de encabezado y carga útil de JOSE son gestionados por IANA. En el ejemplo anterior, los campos y reclamaciones son asunto (ect), nombre, emitido a las (iat) y exp (fecha de caducidad).
La firma se calcula aplicando el algoritmo indicado a la concatenación del encabezado, ‘.’ y la carga útil y, a continuación, codificar en base64url el resultado. A partir de entonces, las tres partes separadas por un punto forman el JWT. Los detalles de cómo se derivan las firmas se definen en RFC 7515.
Puede acceder al JWT anterior en este depurador en línea en JTW.io. Primero, mostrará el mensaje “Firma no válida”. Puede resolverlo reemplazando el secreto predeterminado que se muestra por !!!my-really-big-256-bit-secret!!!.