Maison  >  Article  >  développement back-end  >  La meilleure façon d'implémenter OAuth2.0 en utilisant PHP

La meilleure façon d'implémenter OAuth2.0 en utilisant PHP

王林
王林original
2023-06-08 09:09:171833parcourir

OAuth2.0 est un protocole utilisé pour autoriser des applications tierces à accéder aux ressources des utilisateurs. Il est désormais largement utilisé dans le domaine Internet. Avec le développement du commerce Internet, de plus en plus d'applications doivent prendre en charge le protocole OAuth2.0. Cet article présentera la meilleure façon d'implémenter le protocole OAuth2.0 à l'aide de PHP.

1. Connaissances de base d'OAuth2.0

Avant d'introduire la mise en œuvre d'OAuth2.0, nous devons comprendre quelques connaissances de base d'OAuth2.0.

  1. Type d'autorisation

Le protocole OAuth2.0 définit 4 types d'autorisation différents : le mode code d'autorisation (code d'autorisation), le mode d'autorisation implicite (implicite octroi), le mode mot de passe (informations d'identification du mot de passe du propriétaire de la ressource) et le mode client (informations d'identification du client). Différents types d'autorisation conviennent à différents scénarios. Le type d'autorisation spécifique à utiliser doit être déterminé en fonction des besoins de l'entreprise.

  1. role

Le protocole OAuth2.0 définit trois rôles : propriétaire de ressource, client et serveur de ressources. Le propriétaire de la ressource fait référence à l'utilisateur autorisé, le client fait référence à l'application tierce et le serveur de ressources fait référence au serveur sur lequel les ressources de l'utilisateur sont stockées.

  1. Process

Le processus dans le protocole OAuth2.0 comprend les étapes suivantes :

(1) Client au Le propriétaire de la ressource demande l'autorisation ;

(2) Le propriétaire de la ressource accepte l'autorisation et délivre un code d'autorisation au client

(3) Le client porte l'autorisation ; code au serveur de ressources Demander un jeton d'accès ;

(4) Le serveur de ressources vérifie le code d'autorisation et délivre le jeton d'accès au client.

2. Méthode d'implémentation

Concernant la méthode d'implémentation du protocole OAuth2.0, il existe de nombreuses solutions matures sur le marché, comme Laravel Passport, PHP League OAuth2 Server, etc . Cet article se concentrera sur la mise en œuvre du serveur PHP League OAuth2.

  1. Configuration de l'environnement

Tout d'abord, vous devez créer un nouveau projet PHP et installer le composant PHP League OAuth2 Server. La méthode d'installation est la suivante :

composer require league/oauth2-server

Ensuite, vous devez créer une base de données et créer la structure de table suivante :

``
CREATE TABLE oauth_clients (# 🎜🎜#

client_id VARCHAR(80) NOT NULL,
client_secret VARCHAR(80) NOT NULL,
redirect_uri VARCHAR(2000) NOT NULL,
grant_types VARCHAR(80),
scope VARCHAR(4000),
user_id VARCHAR(255),
CONSTRAINT clients_client_id_pk PRIMARY KEY (client_id)
# 🎜🎜#);

CREATE TABLE oauth_access_tokens (

access_token VARCHAR(40) NOT NULL,
client_id VARCHAR(80) NOT NULL,
user_id VARCHAR(255),
expires TIMESTAMP NOT NULL,
scope VARCHAR(4000),
CONSTRAINT access_token_pk PRIMARY KEY (access_token)

);

CREATE TABLE oauth_authorization_codes (# 🎜🎜#

authorization_code VARCHAR(40) NOT NULL,
client_id VARCHAR(80) NOT NULL,
user_id VARCHAR(255),
redirect_uri VARCHAR(2000),
expires TIMESTAMP NOT NULL,
scope VARCHAR(4000),
CONSTRAINT auth_code_pk PRIMARY KEY (authorization_code)
# 🎜🎜#) ;

CREATE TABLE oauth_refresh_tokens (

refresh_token VARCHAR(40) NOT NULL,
client_id VARCHAR(80) NOT NULL,
user_id VARCHAR(255),
expires TIMESTAMP NOT NULL,
scope VARCHAR(4000),
CONSTRAINT refresh_token_pk PRIMARY KEY (refresh_token)

);

2. 配置服务器

在PHP项目中创建一个OAuth2服务器文件,并进行基本配置。实现代码如下:

require_once

DIR#🎜 🎜# . php';

use LeagueOAuth2ServerAuthorizationServer;

use LeagueOAuth2ServerResourceServer;use LeagueOAuth2ServerGrantClientCredentialsGrant;use LeagueOAuth2ServerGrantPasswordGrant;#🎜🎜 # utilisez LeagueOAuth2ServerGrantAuthCodeGrant;

utilisez LeagueOAuth2ServerGrantImplicitGrant;# 🎜🎜#use LeagueOAuth2ServerRepositories{AccessTokenRepositoryInterface,

AuthCodeRepositoryInterface,
ClientRepositoryInterface,
RefreshTokenRepositoryInterface,
UserRepositoryInterface};

use LeagueOAuth2Server{ResourceServer, AuthorizationValidatorsBearerTokenValidator};

//Configure Server
$server = new Author izationServer(#🎜 🎜 #
$clientRepository,
$accessTokenRepository,
$scopeRepository,
$privateKey,
$publicKey

);

//Configurer le type d'octroi

$server->enableGrantType(new ClientCredentialsGrant());

$server->enableGrantType( # 🎜🎜#
new PasswordGrant(
    $userRepository,
    $refreshTokenRepository
)

);
$server->enableGrantType(

new AuthCodeGrant(
    $authCodeRepository,
    $refreshTokenRepository,
    new DateInterval('PT10M')
)

);

$server->enableGrantType(

new ImplicitGrant(
    new DateInterval('PT1H')
)
# 🎜 🎜#);

// Configurer le serveur de ressources

$resourceServer = new ResourceServer(

$accessTokenRepository,
$publicKey

);

// Configurer BearerTokenValidator
$bearerTokenValidator = new BearerTokenValidator(

$accessTokenRepository,
$publicKey

);

上述代码中的各个参数需要根据实际的业务需求进行具体配置。

3. 执行授权请求

在OAuth2服务器文件中,需要实现授权请求的处理逻辑。实现代码如下:

use PsrHttpMessageServerRequestInterface;
use PsrHttpMessageRes ponseInterface;#🎜 🎜#

/ / Demande d'autorisation de traitement

$server->respondToAccessTokenRequest($request, $response);

上述代码中的$request和$response分别为从HTTP传输层获取的请求参数和响应结果。需要根据实际业务需求进行具体实现。

4. 请求受保护的资源

完成授权后,客户端可以携带访问令牌请求受保护的资源。OAuth2.0服务器需要对访问令牌进行验证,并返回相应的结果。实现代码如下:

// Vérifier le jeton du porteur
try {

$bearerTokenValidator->validateAuthorization($request);
#🎜🎜 # } catch (Exception $e) {

$response->getBody()->write($e->getMessage());
return $response->withHeader('Content-Type', 'text/plain')->withStatus(401);

}


// Traiter le jeton d'accès dans l'en-tête de la requête

$accessToken = $request->getHeader ( 'Autorisation')[0];

$accessToken = substr($accessToken, strpos($accessToken, ' ') + 1);

// Vérifier le jeton d'accès

essayez {

$resourceServer->validateAuthenticatedRequest($request);
$response->getBody()->write('Access granted');

} catch (Exception $e) {

$errorMessage = $e->getMessage();
$response->getBody()->write($errorMessage);
return $response->withHeader('Content-Type', 'text/plain')->withStatus(401);

}

5. 总结

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn