Einleitung: Warum OAuth 2.0 und JWT in PHP notwendig sind
Moderne Webanwendungen arbeiten selten isoliert. Benutzer erwarten einen einheitlichen Login über Google, Facebook oder GitHub, und Entwickler einen sicheren Datenaustausch zwischen Microservices. Zwei Schlüsselprotokolle – OAuth 2.0 (Zugriffsdelegierung) und JWT (kompaktes Token-Format) – sind zum De-facto-Standard geworden. In diesem Artikel werden wir erläutern, wie man OAuth 2.0 und JWT-Autorisierung in PHP von Grund auf implementiert, wobei nur die integrierten Sprachfunktionen und gängige Bibliotheken verwendet werden. Sie erhalten fertige Codebeispiele für die Integration mit externen Anbietern und die Erstellung eines eigenen Authentifizierungssystems.
1. Grundlagen von OAuth 2.0: Abläufe und Rollen
OAuth 2.0 ist ein Autorisierungsprotokoll, das Drittanwendungen den eingeschränkten Zugriff auf Benutzerressourcen ermöglicht, ohne das Passwort weiterzugeben. Es sind vier Rollen beteiligt:
- Resource Owner – der Benutzer, der die Daten besitzt.
- Client – Ihre PHP-Anwendung, die Zugriff anfordert.
- Authorization Server – der Server, der Token ausstellt (z. B. Google).
- Resource Server – die API, die Daten basierend auf dem Token bereitstellt.
Der beliebteste Ablauf für Webanwendungen ist der Authorization Code Grant. Er ist sicher, da das Token über den Serverteil und nicht über den Browser übertragen wird. Betrachten wir die Implementierung in PHP.
1.1. Registrierung der Anwendung und Erhalt von Client ID/Secret
Bevor Sie Code schreiben, registrieren Sie die Anwendung beim Anbieter (z. B. in der Google Cloud Console). Sie erhalten client_id und client_secret und konfigurieren einen Redirect-URI (z. B. https://ihreseite.de/callback.php).
1.2. Implementierung des Authorization Code Ablaufs in PHP
Wir erstellen zwei Dateien: login.php (Weiterleitung zum Autorisierungsserver) und callback.php (Verarbeitung der Antwort).
Datei login.php
<?phpsession_start();
$client_id = 'IHRE_CLIENT_ID';$redirect_uri = 'https://ihreseite.de/callback.php';$state = bin2hex(random_bytes(16)); // Schutz vor CSRF$_SESSION['oauth_state'] = $state;
$params = http_build_query([ 'client_id' => $client_id, 'redirect_uri' => $redirect_uri, 'response_type' => 'code', 'scope' => 'openid email profile', 'state' => $state,]);
header('Location: https://accounts.google.com/o/oauth2/v2/auth?' . $params);exit;?>Datei callback.php
<?phpsession_start();
// Überprüfung des state (CSRF)if ($_GET['state'] !== $_SESSION['oauth_state']) { die('Fehler: Ungültiger state');}
$client_id = 'IHRE_CLIENT_ID';$client_secret = 'IHR_CLIENT_SECRET';$redirect_uri = 'https://ihreseite.de/callback.php';
// Austausch des Codes gegen ein Token$ch = curl_init('https://oauth2.googleapis.com/token');curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ 'code' => $_GET['code'], 'client_id' => $client_id, 'client_secret' => $client_secret, 'redirect_uri' => $redirect_uri, 'grant_type' => 'authorization_code',]));curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$response = curl_exec($ch);curl_close($ch);
$data = json_decode($response, true);$access_token = $data['access_token'] ?? null;
// Abrufen des Benutzerprofils$ch = curl_init('https://www.googleapis.com/oauth2/v2/userinfo');curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer ' . $access_token]);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$userInfo = json_decode(curl_exec($ch), true);curl_close($ch);
echo 'Hallo, ' . htmlspecialchars($userInfo['email']);?>Wichtig: Überprüfen Sie immer den Parameter state. Er schützt vor Anfragenfälschung (CSRF).