Einführung in OAuth 2.0 und JWT in PHP
\nModerne Webanwendungen entfernen sich zunehmend von der klassischen Sitzungsauthentifizierung und setzen auf flexiblere und skalierbarere Lösungen. Zwei Schlüsselprotokolle – OAuth 2.0 und JWT (JSON Web Tokens) – sind zum De-facto-Standard für die Autorisierung in REST-APIs, mobilen Anwendungen und Microservices-Architekturen geworden. In diesem Artikel werden wir anhand praktischer Beispiele durchgehen, wie man OAuth 2.0 und JWT-Autorisierung in PHP implementiert, unter Verwendung moderner Bibliotheken und bewährter Sicherheitspraktiken.
\nSie erfahren, wie Sie einen Autorisierungsserver einrichten, JWT-Token ausstellen und überprüfen, die Ausgabe von Refresh-Token organisieren und Ihre API-Endpunkte schützen. Alle Codebeispiele sind bereit für den Einsatz in Ihren Projekten.
\n\nGrundlagen des OAuth 2.0-Protokolls
\nOAuth 2.0 ist ein Autorisierungsprotokoll, das es Anwendungen ermöglicht, eingeschränkten Zugriff auf Benutzerressourcen zu erhalten, ohne deren Anmeldeinformationen weiterzugeben. Im Kontext einer PHP-Anwendung wird OAuth 2.0 in der Regel über den Authorization Code Grant oder den Password Grant für eigene Dienste implementiert.
\n\nSchlüsselrollen in OAuth 2.0
\n- \n
- Resource Owner – der Benutzer, der die Daten besitzt \n
- Client – die Anwendung, die Zugriff anfordert (z. B. Ihr PHP-Frontend) \n
- Authorization Server – der Server, der Token ausstellt
- Resource Server – der Server, der geschützte Ressourcen bereitstellt (Ihre API)
Ablauf der Token-Erlangung über Authorization Code Grant
\n- \n
- Der Benutzer navigiert zur Autorisierungsseite
- Nach der Anmeldung wird der Benutzer mit einem temporären Code zurück zur Anwendung umgeleitet
- Der PHP-Server tauscht den Code gegen access_token und refresh_token ein
- Alle nachfolgenden API-Anfragen erfolgen mit dem Header
Authorization: Bearer <access_token>
Implementierung von JWT in PHP mit der Bibliothek firebase/php-jwt
\nFür die Arbeit mit JWT in PHP verwenden wir die beliebte Bibliothek firebase/php-jwt. Installieren Sie sie über Composer:
composer require firebase/php-jwt\n\nGenerierung eines JWT-Tokens
\nErstellen wir eine Funktion zum Ausstellen eines Access-Tokens mit Nutzlast (Claims):
\n<?php\nuse Firebase\\JWT\\JWT;\nuse Firebase\\JWT\\Key;\n\nfunction generateAccessToken(int $userId, string $email): string {\n $secretKey = 'your-256-bit-secret-key-here';\n $issuedAt = time();\n $expirationTime = $issuedAt + 3600; // 1 Stunde\n\n $payload = [\n 'iss' => 'pythonlib.ru',\n 'iat' => $issuedAt,\n 'exp' => $expirationTime,\n 'sub' => $userId,\n 'email' => $email,\n 'roles' => ['user']\n ];\n\n return JWT::encode($payload, $secretKey, 'HS256');\n}\n\nVerifizierung eines JWT-Tokens
\nÜberprüfung der Token-Authentizität bei jeder Anfrage an eine geschützte Ressource:
\n<?php\nfunction validateAccessToken(string $token): ?object {\n $secretKey = 'your-256-bit-secret-key-here';\n try {\n $decoded = JWT::decode($token, new Key($secretKey, 'HS256'));\n return $decoded;\n } catch (\\Exception $e) {\n // Token abgelaufen, ungültig oder Signatur stimmt nicht überein\n return null;\n }\n}\n\nMiddleware zur JWT-Überprüfung
\nBeispiel einer einfachen Middleware, die mit jedem Framework verwendet werden kann:
\n<?php\nfunction authMiddleware(): ?object {\n $headers = getallheaders();\n $authHeader = $headers['Authorization'] ?? '';\n\n if (!preg_match('/Bearer\\s(\\S+)/', $authHeader, $matches)) {\n http_response_code(401);\n echo json_encode(['error' => 'Token nicht bereitgestellt']);\n exit;\n }\n\n $token = $matches[1];\n $user = validateAccessToken($token);\n\n if (!$user) {\n http_response_code(401);\n