JWT-Tokens in PHP: Vollständiger Implementierungsleitfaden
\n\nJWT (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\nIn 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\nWas ist JWT und warum wird es benötigt?
\n\nJWT 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
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
Installation der Bibliothek firebase/php-jwt
\n\nFür die Arbeit mit JWT in PHP verwenden wir die beliebte Bibliothek firebase/php-jwt. Die Installation erfolgt über Composer:
composer require firebase/php-jwt\n\nNach der Installation erscheint im Projekt der Composer-Autoloader, der eingebunden werden muss:
\n\nrequire_once 'vendor/autoload.php';\n\nuse Firebase\\JWT\\JWT;\nuse Firebase\\JWT\\Key;\n\nErstellung eines JWT-Tokens
\n\nZum Erstellen eines Tokens müssen Sie einen geheimen Schlüssel ($secretKey) definieren und einen Payload erstellen. Beispiel:
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\nAls Ergebnis erhalten Sie eine Zeichenfolge wie: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJweXRob25saWIucnUiLCJpYXQiOjE3Mjg0MDAwMDAsImV4cCI6MTcyODQwMzYwMCwic3ViIjoxMjMsInJvbGUiOiJhZG1pbiJ9.signature
Überprüfung und Dekodierung von JWT
\n\nBeim Erhalt eines Tokens vom Client (z. B. aus dem Header Authorization: Bearer <token>) muss dieses überprüft werden:
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\nWichtig: 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\nAktualisierung von JWT (Refresh Token)
\n\nZur 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\nBeispiel einer Refresh-Implementierung:
\n\nfunction refreshAccessToken(string $ref Auch in der Bibliothek
Bcrypt für JavaScript (Node.js): Komplette Anleitung mit Beispielen
NaturalLanguage für Swift: Das komplette Handbuch mit Beispielen