Dans les applications mobiles et web actuelles, les API sont un élément essentiel. Elles fournissent des interfaces interactives pour les utilisateurs et les applications. Cependant, ces API présentent également des risques pour les utilisateurs malveillants et les pirates informatiques, et peuvent entraîner une fuite de données sensibles. Par conséquent, les API doivent être sécurisées pour empêcher tout accès non autorisé. OAuth 2.0 est un moyen éprouvé pour vous permettre d'accéder à une API via un jeton tout en garantissant que vous êtes autorisé à le faire.
Dans cet article, nous explorerons comment intégrer OAuth 2.0 en PHP pour sécuriser les API.
Qu'est-ce qu'OAuth 2.0 ?
OAuth 2.0 est un standard ouvert qui permet aux utilisateurs d'autoriser des tiers à accéder à leurs ressources (par exemple, photos, documents, contacts, etc.). Plus précisément, OAuth 2.0 utilise des jetons d'autorisation pour accéder à ses ressources au nom des utilisateurs. Un jeton d'accès est un identifiant émis par un serveur d'autorisation et fourni à l'appelant lors de l'accès à une ressource. Les appelants peuvent utiliser ce jeton à chaque demande pour indiquer qu'ils sont autorisés à accéder à la ressource.
Intégrer OAuth 2.0 en PHP
En PHP, il existe de nombreuses bibliothèques OAuth 2.0 parmi lesquelles choisir. Dans cet article, nous présenterons le processus d'implémentation d'OAuth 2.0 à l'aide du package phpleague/oauth2-client.
Étape 1 : Installer le package PHPleague/oauth2-client
Nous devons d'abord installer le package PHPleague/oauth2-client. Il peut être installé à l'aide du gestionnaire de packages Composer. Accédez au répertoire de votre projet dans un terminal ou une interface de ligne de commande et exécutez-y la commande suivante :
composer require league/oauth2-client
Étape 2 : Configurez le client fournisseur Définissez le client fournisseur. Ici, nous utilisons le fournisseur GitHub OAuth comme exemple. Tout d'abord, modifiez les valeurs des constantes CLIENT_ID et CLIENT_SECRET avec vos informations d'identification réelles d'application.
<?php require 'vendor/autoload.php'; use LeagueOAuth2ClientProviderGithub; const CLIENT_ID = 'your_client_id'; const CLIENT_SECRET = 'your_client_secret'; const REDIRECT_URI = 'http://localhost/oauth2/callback.php'; $provider = new Github([ 'clientId' => CLIENT_ID, 'clientSecret' => CLIENT_SECRET, 'redirectUri' => REDIRECT_URI, ]);
Étape 3 : Obtenir le code d'autorisation
Ensuite, nous devons obtenir le code d'autorisation. Le code d'autorisation est un jeton temporaire utilisé pour vérifier l'identité lors de l'obtention ultérieure d'un jeton d'accès.
<?php $authorizationUrl = $provider->getAuthorizationUrl([ 'scope' => ['user', 'repo', 'notifications'] ]); $_SESSION['oauth2state'] = $provider->getState(); header('Location: ' . $authorizationUrl);
Dans le code ci-dessus, la méthode getAuthorizationUrl()
renvoie une URL d'autorisation, et accéder à cette URL dirigera l'utilisateur vers GitHub, lui demandant de fournir un jeton d'accès . Lorsque GitHub autorise, il redirige l'utilisateur vers un URI de redirection contenant le code d'autorisation.
Étape 4 : Obtenir le jeton d'accèsgetAuthorizationUrl()
方法返回一个授权URL,跳转到该URL将引导用户到GitHub,要求他们提供访问令牌。当GitHub授权后,它会将用户重新路由到一个重定向URI,其中包含授权码。
步骤4:获取访问令牌
现在,我们需要使用我们在上一步中获得的授权码来获取访问令牌。
<?php if (isset($_GET['code']) && isset($_GET['state']) && isset($_SESSION['oauth2state'])) { if ($_GET['state'] === $_SESSION['oauth2state']) { try { $token = $provider->getAccessToken('authorization_code', [ 'code' => $_GET['code'] ]); $accessToken = $token->getToken(); $refreshToken = $token->getRefreshToken(); $expires = $token->getExpires(); } catch (Exception $e) { exit('Failed to get access token: ' . $e->getMessage()); } // Get the user object. try { $user = $provider->getResourceOwner($token); $name = $user->getName(); $email = $user->getEmail(); $imageUrl = $user->getAvatarUrl(); $profileUrl = $user->getHtmlUrl(); } catch (Exception $e) { exit('Failed to get user: ' . $e->getMessage()); } // Store the access token and user data somewhere // for use in your application. $_SESSION['github_access_token'] = $accessToken; $_SESSION['github_refresh_token'] = $refreshToken; $_SESSION['github_expires'] = $expires; $_SESSION['github_user_name'] = $name; $_SESSION['github_user_email'] = $email; $_SESSION['github_user_image'] = $imageUrl; $_SESSION['github_user_profile_url'] = $profileUrl; // Redirect the user to the original page // or some other authorized page in your application. header('Location: /'); exit(); } else { exit('Invalid state'); } }
在上面的代码中,我们首先使用getAccessToken()
方法获取访问令牌。然后,我们使用getResourceOwner()
<?php $client = new GuzzleHttpClient(); $response = $client->request('GET', 'https://api.github.com/user', [ 'headers' => [ 'Authorization' => 'Bearer ' . $_SESSION['github_access_token'], 'User-Agent' => 'OAuth2 Client' ] ]); $body = $response->getBody(); $userData = json_decode($body, true);
getAccessToken()
pour obtenir le jeton d'accès. Ensuite, nous utilisons la méthode getResourceOwner()
pour obtenir l'objet utilisateur. Enfin, nous stockons les données utilisateur et le jeton d'accès dans la session. Étape 5 : Appeler l'API à l'aide du jeton d'accèsEnfin, nous pouvons appeler l'API protégée à l'aide du jeton d'accès. Dans cet exemple, nous utiliserons l'API GitHub, qui nous oblige à nous authentifier à l'aide d'un jeton d'accès. rrreee
Dans le code ci-dessus, nous avons appelé l'API GitHub en utilisant le client HTTP Guzzle. Nous définissons l'en-tête Authorization avec le jeton d'accès pour indiquer que nous avons l'autorisation d'accéder à cette API. ConclusionIntégrer OAuth 2.0 dans PHP est un excellent moyen de sécuriser votre API. En utilisant le package phpleague/oauth2-client, nous pouvons obtenir un jeton d'accès du fournisseur et utiliser ce jeton pour appeler l'API protégée. De plus, nous pouvons stocker les données utilisateur et les jetons pour une utilisation future. #🎜🎜##🎜🎜#Vous pouvez désormais commencer à intégrer OAuth 2.0 pour sécuriser votre API et protéger les données des utilisateurs. #🎜🎜#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!