Einführung in OAuth 2.0 und JWT in PHP
\n\nModerne Webanwendungen kommen selten ohne Autorisierungssysteme aus. Die beiden beliebtesten Protokolle – OAuth 2.0 und JWT (JSON Web Token) – ermöglichen es Entwicklern, sichere und skalierbare Lösungen zu erstellen. In diesem Artikel werden wir durchgehen, wie man OAuth 2.0- und JWT-Autorisierung in PHP von Grund auf implementiert. Das Material richtet sich an Anfänger, daher werden alle Konzepte in einfacher Sprache mit praktischen Beispielen erklärt.
\n\nOAuth 2.0 ist ein Protokoll für delegierten Zugriff. Es ermöglicht Benutzern, Dritten eingeschränkten Zugriff auf ihre Ressourcen zu gewähren, ohne das Passwort weiterzugeben. JWT wiederum ist ein kompaktes Token-Format, das alle notwendigen Informationen über den Benutzer und seine Berechtigungen enthält.
\n\nWas ist JWT und wie funktioniert es?
\n\nJWT (JSON Web Token) ist ein offener Standard (RFC 7519), der eine kompakte und eigenständige Möglichkeit zur Übertragung von Informationen zwischen Parteien als JSON-Objekt definiert. Das Token besteht aus drei durch Punkte getrennten Teilen:
\n\n- \n
- Header – enthält Informationen über den Tokentyp und den Verschlüsselungsalgorithmus (normalerweise HS256 oder RS256). \n
- Payload – enthält die "Claims": Benutzerdaten, Ausgabezeit (iat), Ablaufzeit (exp) und andere. \n
- Signature – eine Signatur, die auf Basis von Header, Payload und einem geheimen Schlüssel erstellt wird. Garantiert die Datenintegrität. \n
So sieht ein typischer JWT aus:
\n\neyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6ItCQ0L3QsNGC0L7Qu9C40LkiLCJpYXQiOjE1MTYyMzkwMjJ9.4vGJ7qF6b0Q9l8z3X5p2Rk1h7t9y2w4z6x8c0v2b4n6m8\n\nDer Vorteil von JWT besteht darin, dass der Server keine Sitzungen in der Datenbank speichern muss – alle Informationen sind bereits im Token codiert. Dies macht das System leicht skalierbar.
\n\nInstallation der Bibliothek für die Arbeit mit JWT in PHP
\n\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\nErstellung und Verifizierung eines JWT-Tokens
\n\nBetrachten wir ein grundlegendes Beispiel für die Erstellung eines Tokens beim Benutzer-Login und dessen Überprüfung bei einer Anfrage an eine geschützte Ressource.
\n\n1. Token-Generierung (login.php):
\n\n<?php\nrequire_once 'vendor/autoload.php';\n\nuse Firebase\\JWT\\JWT;\nuse Firebase\\JWT\\Key;\n\n$secretKey = 'Ihr-geheimer-Schlüssel-mit-mindestens-32-Zeichen';\n\n// Benutzerdaten nach erfolgreicher Authentifizierung\n$payload = [\n 'iss' => 'pythonlib.ru', // Token-Aussteller\n 'sub' => $userId, // Benutzer-ID\n 'name' => $userName, // Benutzername\n 'role' => 'user', // Rolle\n 'iat' => time(), // Ausgabezeit\n 'exp' => time() + 3600 // Token läuft in 1 Stunde ab\n];\n\n$jwt = JWT::encode($payload, $secretKey, 'HS256');\n\n// Senden des Tokens an den Client\necho json_encode(['token' => $jwt]);\n?>\n\n2. Token-Überprüfung (profile.php):
\n\n<?php\nrequire_once 'vendor/autoload.php';\n\nuse Firebase\\JWT\\JWT;\nuse Firebase\\JWT\\Key;\n\n$secretKey = 'Ihr-geheimer-Schlüssel-mit-mindestens-32-Zeichen';\n\n// Token aus dem Authorization-Header abrufen\n$headers = getallheaders();\n$authHeader = $headers['Authorization'] ?? '';\n\nif (preg_match('/Bearer\\s(\\S+)/', $authHeader, $matches)) {\n $jwt = $matches[1];\n \n try {\n $decoded = JWT::decode($jwt, new Key($secretKey, 'HS256'));\n \n // Token ist gültig, Benutzerdaten abrufen\n $userId = $decoded->sub;\n $userName = $decoded->name;\n \n // Geschützte Daten zurückgeben\n echo json_encode(['status' => 'success', 'user' => $decoded]);\n \n } catch (Exception $e) {\n // Token ist ungültig oder abgelaufen\n htt