Referencia para desarrolladores JWT
Ejemplos de Decodificación JWT
Uso estos ejemplos mínimos cuando necesito inspeccionar un JWT en código sin confundir lectura con autenticidad.
Ejemplos por lenguaje
JavaScript (browser)
function decodePart(part) {
const base64 = part.replace(/-/g, "+").replace(/_/g, "/");
const padded = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), "=");
const binary = atob(padded);
const bytes = Uint8Array.from(binary, c => c.charCodeAt(0));
return JSON.parse(new TextDecoder("utf-8").decode(bytes));
}
const [header, payload] = token.split(".");
console.log(decodePart(header));
console.log(decodePart(payload));Node.js
const [header, payload] = token.split(".");
const decodePart = part => JSON.parse(Buffer.from(part, "base64url").toString("utf8"));
console.log(decodePart(header));
console.log(decodePart(payload));Python
import base64, json
def decode_part(part):
part += "=" * (-len(part) % 4)
return json.loads(base64.urlsafe_b64decode(part).decode("utf-8"))
header, payload, _ = token.split(".")
print(decode_part(header))
print(decode_part(payload))Java
import java.nio.charset.StandardCharsets;
import java.util.Base64;
String[] parts = token.split("\.");
String headerJson = new String(Base64.getUrlDecoder().decode(parts[0]), StandardCharsets.UTF_8);
String payloadJson = new String(Base64.getUrlDecoder().decode(parts[1]), StandardCharsets.UTF_8);
System.out.println(headerJson);
System.out.println(payloadJson);C#
using System;
using System.Text;
static string DecodeBase64Url(string part) {
string value = part.Replace('-', '+').Replace('_', '/');
value = value.PadRight(value.Length + ((4 - value.Length % 4) % 4), '=');
return Encoding.UTF8.GetString(Convert.FromBase64String(value));
}
var parts = token.Split('.');
Console.WriteLine(DecodeBase64Url(parts[0]));
Console.WriteLine(DecodeBase64Url(parts[1]));Go
package main
import (
"encoding/base64"
"fmt"
"strings"
)
func main() {
parts := strings.Split(token, ".")
header, _ := base64.RawURLEncoding.DecodeString(parts[0])
payload, _ := base64.RawURLEncoding.DecodeString(parts[1])
fmt.Println(string(header))
fmt.Println(string(payload))
}PHP
function decode_base64url(string $part): string {
$value = strtr($part, '-_', '+/');
$value .= str_repeat('=', (4 - strlen($value) % 4) % 4);
return base64_decode($value, true);
}
[$header, $payload] = explode('.', $token);
var_dump(json_decode(decode_base64url($header), true));
var_dump(json_decode(decode_base64url($payload), true));Reglas que mantengo en todos los lenguajes
- Normalizo Base64URL en lugar de asumir Base64 normal.
- Decodifico bytes como UTF-8 antes de interpretar JSON.
- Trato header y payload como datos no confiables hasta verificar la firma.
- Issuer, audience, tiempo y política de algoritmos pertenecen a la configuración de la aplicación.