OAuth 2.0 und JWT-Autorisierung in PHP: vollständige praktische Anleitung

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

Einführung in OAuth 2.0 und JWT in PHP

\n

Moderne 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.

\n

Sie 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\n

Grundlagen des OAuth 2.0-Protokolls

\n

OAuth 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\n

Schlü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)
\n\n

Ablauf der Token-Erlangung über Authorization Code Grant

\n
    \n
  1. Der Benutzer navigiert zur Autorisierungsseite
  2. Nach der Anmeldung wird der Benutzer mit einem temporären Code zurück zur Anwendung umgeleitet
  3. Der PHP-Server tauscht den Code gegen access_token und refresh_token ein
  4. Alle nachfolgenden API-Anfragen erfolgen mit dem Header Authorization: Bearer <access_token>
\n\n

Implementierung von JWT in PHP mit der Bibliothek firebase/php-jwt

\n

Für die Arbeit mit JWT in PHP verwenden wir die beliebte Bibliothek firebase/php-jwt. Installieren Sie sie über Composer:

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

Generierung eines JWT-Tokens

\n

Erstellen 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\n

Verifizierung 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\n

Middleware zur JWT-Überprüfung

\n

Beispiel 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                

Blogs

Buchempfehlungen