OAuth in PHP: Erstellen eines JWT-Autorisierungsservers
Mit dem Aufkommen mobiler Anwendungen und dem Trend der Front-End- und Back-End-Trennung ist OAuth zu einem unverzichtbaren Bestandteil moderner Webanwendungen geworden. OAuth ist ein Autorisierungsprotokoll, das Benutzerressourcen durch die Bereitstellung standardisierter Prozesse und Mechanismen vor unbefugtem Zugriff schützt. In diesem Artikel erfahren Sie, wie Sie mit PHP einen OAuth-Autorisierungsserver basierend auf JWT (JSON Web Tokens) erstellen.
JWT ist eine sichere Möglichkeit, Informationen über das Internet weiterzugeben. Es besteht aus drei Teilen, nämlich Header, Payload und Signatur. Der Header enthält normalerweise einige Metadaten, z. B. Algorithmus und Tokentyp. Die Nutzlast enthält bestimmte zu übergebende Informationen, wie z. B. Benutzer-ID, Berechtigungen und Ablaufzeit. Die Signatur ist das Ergebnis der Verschlüsselung des Headers und der Nutzdaten mithilfe eines privaten Schlüssels, um die Integrität und Sicherheit des Tokens sicherzustellen.
Zuerst müssen wir ein PHP-Projekt erstellen und eine JWT-Bibliothek installieren. In diesem Beispiel verwenden wir die Bibliothek „firebase/php-jwt“. Es kann über Composer installiert werden. Führen Sie den folgenden Befehl aus:
composer require firebase/php-jwt
Im Stammverzeichnis des Projekts erstellen wir eine Datei „oauth.php“, die als Autorisierungsserver dient.
Hier ist ein einfaches Codebeispiel für einen Autorisierungsserver:
<?php require 'vendor/autoload.php'; use FirebaseJWTJWT; // 定义服务器密钥 $server_key = 'your-secret-key'; // 定义过期时间,单位为秒 $expiry_time = 3600; // 定义有效的客户端ID和秘密 $valid_clients = [ 'client_id1' => 'client_secret1', 'client_id2' => 'client_secret2', ]; // 验证客户端ID和秘密 function verify_client_credentials($client_id, $client_secret) { global $valid_clients; return isset($valid_clients[$client_id]) && $valid_clients[$client_id] === $client_secret; } // 授权服务器端点 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 验证客户端身份 $client_id = $_POST['client_id']; $client_secret = $_POST['client_secret']; if (!verify_client_credentials($client_id, $client_secret)) { http_response_code(401); echo json_encode(['error' => 'Invalid client credentials']); exit; } // 创建JWT $token = [ 'iss' => $_SERVER['SERVER_NAME'], 'aud' => $client_id, 'iat' => time(), 'exp' => time() + $expiry_time ]; $jwt = JWT::encode($token, $server_key); // 返回JWT给客户端 echo json_encode(['access_token' => $jwt]); exit; } // 获取JWT if ($_SERVER['REQUEST_METHOD'] === 'GET') { $auth_header = $_SERVER['HTTP_AUTHORIZATION']; $jwt = substr($auth_header, 7); // 去掉"Bearer "前缀 try { // 验证和解码JWT $decoded = JWT::decode($jwt, $server_key, ['HS256']); // 验证有效性 if ($decoded->exp < time()) { http_response_code(401); echo json_encode(['error' => 'Token expired']); exit; } // 返回用户信息或其他受保护的资源 echo json_encode(['user_id' => $decoded->sub]); exit; } catch (Exception $e) { // 如果JWT无效,返回错误 http_response_code(401); echo json_encode(['error' => $e->getMessage()]); exit; } } ?>
Im obigen Beispiel definieren wir zunächst den Serverschlüssel ($server_key
) und die Ablaufzeit ($expiry_time
). . Anschließend definieren wir gültige Client-IDs und Geheimnisse ($valid_clients
). $server_key
)和过期时间($expiry_time
)。然后,我们定义了有效的客户端ID和秘密($valid_clients
)。
接下来,我们实现了一个verify_client_credentials
verify_client_credentials
-Funktion, um die Identität des Kunden zu überprüfen. Im Autorisierungsserver-Endpunkt überprüfen wir zunächst die vom Client bereitgestellten Identitätsinformationen, erstellen dann ein JWT und geben es an den Client zurück. Am Endpunkt zum Abrufen des JWT holen wir zuerst das JWT aus dem HTTP-Anfrageheader und validieren und dekodieren es dann. Wenn das JWT gültig und nicht abgelaufen ist, geben wir die Benutzerinformationen oder andere geschützte Ressourcen zurück. Es ist zu beachten, dass der obige Code nur zu Demonstrationszwecken dient. Bei der tatsächlichen Verwendung müssen wir ihn entsprechend den spezifischen Anforderungen erweitern und ändern.
Zusammenfassung:
Das obige ist der detaillierte Inhalt vonOAuth in PHP: Erstellen Sie einen JWT-Autorisierungsserver. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!