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.