JWT-Entwicklerreferenz

Code-Beispiele zum JWT-Dekodieren

Diese Minimalbeispiele nutze ich, wenn ich JWT-Inhalte im Code lesen möchte, ohne Dekodierung mit Authentizität zu verwechseln.

Decode-Beispiele nach Sprache

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

Was ich in jeder Sprache gleich halte

  • Base64URL korrekt normalisieren statt normales Base64 anzunehmen.
  • Bytes vor JSON-Verarbeitung als UTF-8 dekodieren.
  • Header und Payload bis zur erfolgreichen Signaturprüfung als nicht vertrauenswürdig behandeln.
  • Issuer-, Audience-, Zeit- und Algorithmus-Policy aus der Anwendungskonfiguration beziehen.