JWT-Tokens in PHP: Vollständiger Leitfaden zur Authentifizierung und Autorisierung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

JWT-Tokens in PHP: Vollständiger Implementierungsleitfaden

\n\n

JWT (JSON Web Token) ist ein offener Standard (RFC 7519) zur Erstellung von Zugriffstokens basierend auf dem JSON-Format. In PHP wird JWT häufig für die Implementierung zustandsloser Authentifizierung (stateless authentication) in REST-APIs, Single-Page-Anwendungen (SPA) und Microservices verwendet.

\n\n

In diesem Artikel werden wir im Detail besprechen, wie man mit JWT-Tokens in PHP arbeitet: von der Installation der Bibliothek bis zur Erstellung, Überprüfung und Aktualisierung von Tokens.

\n\n

Was ist JWT und warum wird es benötigt?

\n\n

JWT besteht aus drei Teilen, die durch Punkte getrennt sind:

\n\n
    \n
  • Header — enthält den Tokentyp (JWT) und den Signaturalgorithmus (z. B. HS256 oder RS256).
  • \n
  • Payload — enthält die Claims: Benutzer-ID, Rolle, Ausstellungszeit (iat), Ablaufzeit (exp) und andere Daten.
  • \n
  • Signature — wird durch Hashing des Headers und des Payloads mit einem geheimen Schlüssel erstellt.
  • \n
\n\n

Hauptvorteile von JWT:

\n
    \n
  • Erfordert keine Speicherung von Sitzungen auf dem Server (stateless).
  • \n
  • Kann beliebige Daten enthalten (z. B. die Benutzerrolle).
  • \n
  • Funktioniert mit verschiedenen Domänen und mobilen Anwendungen.
  • \n
  • Kann ohne Datenbankzugriff einfach überprüft werden.
  • \n
\n\n

Installation der Bibliothek firebase/php-jwt

\n\n

Für die Arbeit mit JWT in PHP verwenden wir die beliebte Bibliothek firebase/php-jwt. Die Installation erfolgt über Composer:

\n\n
composer require firebase/php-jwt
\n\n

Nach der Installation erscheint im Projekt der Composer-Autoloader, der eingebunden werden muss:

\n\n
require_once 'vendor/autoload.php';\n\nuse Firebase\\JWT\\JWT;\nuse Firebase\\JWT\\Key;
\n\n

Erstellung eines JWT-Tokens

\n\n

Zum Erstellen eines Tokens müssen Sie einen geheimen Schlüssel ($secretKey) definieren und einen Payload erstellen. Beispiel:

\n\n
use Firebase\\JWT\\JWT;\n\n$secretKey = 'your-256-bit-secret-key-here';\n$issuedAt = time();\n$expirationTime = $issuedAt + 3600; // Token lebt 1 Stunde\n\n$payload = [\n    'iss' => 'pythonlib.ru',        // Aussteller\n    'iat' => $issuedAt,             // Ausstellungszeit\n    'exp' => $expirationTime,       // Ablaufzeit\n    'sub' => 123,                   // Benutzer-ID\n    'role' => 'admin'               // benutzerdefinierte Daten\n];\n\n$jwt = JWT::encode($payload, $secretKey, 'HS256');\necho $jwt;
\n\n

Als Ergebnis erhalten Sie eine Zeichenfolge wie: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJweXRob25saWIucnUiLCJpYXQiOjE3Mjg0MDAwMDAsImV4cCI6MTcyODQwMzYwMCwic3ViIjoxMjMsInJvbGUiOiJhZG1pbiJ9.signature

\n\n

Überprüfung und Dekodierung von JWT

\n\n

Beim Erhalt eines Tokens vom Client (z. B. aus dem Header Authorization: Bearer <token>) muss dieses überprüft werden:

\n\n
use Firebase\\JWT\\JWT;\nuse Firebase\\JWT\\Key;\n\n$secretKey = 'your-256-bit-secret-key-here';\n$jwt = $_SERVER['HTTP_AUTHORIZATION'] ?? '';\n\ntry {\n    $decoded = JWT::decode($jwt, new Key($secretKey, 'HS256'));\n    $userId = $decoded->sub;\n    $role = $decoded->role;\n    \n    echo "Benutzer #{$userId} mit der Rolle {$role} ist autorisiert.";\n} catch (\\Exception $e) {\n    http_response_code(401);\n    echo "Fehler: " . $e->getMessage();\n}
\n\n

Wichtig: Die Bibliothek überprüft automatisch die Ablaufzeit (exp) und die Ausstellungszeit (iat) des Tokens. Wenn das Token abgelaufen oder ungültig ist, wird eine Ausnahme ausgelöst.

\n\n

Aktualisierung von JWT (Refresh Token)

\n\n

Zur Erhöhung der Sicherheit werden JWT-Tokens in der Regel kurzlebig gemacht (15–60 Minuten). Für eine langanhaltende Sitzung wird ein Refresh Token verwendet – ein separates Token, das in der Datenbank gespeichert wird und den Erhalt eines neuen Access Tokens ohne erneute Eingabe von Login/Passwort ermöglicht.

\n\n

Beispiel einer Refresh-Implementierung:

\n\n
function refreshAccessToken(string $ref                    

Empfehlungen