OAuth en PHP : création d'un serveur d'autorisation JWT
Avec l'essor des applications mobiles et la tendance à la séparation front-end et back-end, OAuth est devenu un élément indispensable des applications Web modernes. OAuth est un protocole d'autorisation qui protège les ressources des utilisateurs contre tout accès non autorisé en fournissant des processus et des mécanismes standardisés. Dans cet article, nous allons apprendre comment créer un serveur d'autorisation OAuth basé sur JWT (JSON Web Tokens) à l'aide de PHP.
JWT est un moyen sécurisé de transmettre des informations sur le Web. Il se compose de trois parties, à savoir l'en-tête, la charge utile et la signature. L'en-tête contient généralement des métadonnées, telles que l'algorithme et le type de jeton. La charge utile contient des informations spécifiques à transmettre, telles que l'ID utilisateur, les autorisations et le délai d'expiration. La signature est le résultat du cryptage de l'en-tête et de la charge utile à l'aide d'une clé privée pour garantir l'intégrité et la sécurité du jeton.
Tout d'abord, nous devons créer un projet PHP et installer une bibliothèque JWT. Dans cet exemple, nous utiliserons la bibliothèque "firebase/php-jwt". Il peut être installé via Composer, exécutez la commande suivante :
composer require firebase/php-jwt
Dans le répertoire racine du projet, nous créons un fichier "oauth.php" pour nous servir de serveur d'autorisation.
Voici un exemple simple de code de serveur d'autorisation :
<?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; } } ?>
Dans l'exemple ci-dessus, nous définissons d'abord la clé du serveur ($server_key
) et l'heure d'expiration ($expiry_time code>) . Ensuite, nous définissons des ID client et des secrets valides (<code>$valid_clients
). $server_key
)和过期时间($expiry_time
)。然后,我们定义了有效的客户端ID和秘密($valid_clients
)。
接下来,我们实现了一个verify_client_credentials
verify_client_credentials
pour vérifier l'identité du client. Dans le point de terminaison du serveur d'autorisation, nous vérifions d'abord les informations d'identité fournies par le client, puis créons un JWT et le renvoyons au client. Dans le point de terminaison pour obtenir le JWT, nous obtenons d'abord le JWT à partir de l'en-tête de la requête HTTP, puis nous le validons et le décodons. Si le JWT est valide et n'a pas expiré, nous renverrons les informations utilisateur ou d'autres ressources protégées. Il est à noter que le code ci-dessus est uniquement à des fins de démonstration. En utilisation réelle, nous devons l'étendre et le modifier en fonction des besoins spécifiques.
Résumé :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!