Referência para desenvolvedores JWT

Exemplos de Decodificação JWT

Uso estes exemplos mínimos quando preciso inspecionar um JWT no código sem tratar decodificação como prova de autenticidade.

Exemplos por linguagem

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));

O que mantenho igual em todas as linguagens

  • Normalizo Base64URL corretamente em vez de assumir Base64 comum.
  • Converto bytes para UTF-8 antes de interpretar JSON.
  • Trato header e payload como dados não confiáveis até a verificação da assinatura.
  • Issuer, audience, tempo e política de algoritmo ficam na configuração da aplicação.