ホームページ  >  記事  >  バックエンド開発  >  PHP を使用して OAuth2.0 を実装する最良の方法

PHP を使用して OAuth2.0 を実装する最良の方法

王林
王林オリジナル
2023-06-08 09:09:171827ブラウズ

OAuth2.0 は、サードパーティのアプリケーションがユーザー リソースにアクセスすることを承認するために使用されるプロトコルであり、現在インターネット分野で広く使用されています。インターネット ビジネスの発展に伴い、OAuth2.0 プロトコルをサポートする必要があるアプリケーションがますます増えています。この記事では、PHP を使用して OAuth2.0 プロトコルを実装する最適な方法を紹介します。

1. OAuth2.0の基礎知識

OAuth2.0の実装方法を紹介する前に、OAuth2.0の基礎知識を理解しておく必要があります。

  1. 認可タイプ

OAuth2.0 プロトコルでは、認可コード モード (認可コード)、暗黙的認可モード (暗黙的許可)、パスワード モード (リソース所有者のパスワード認証情報)とクライアント モード(クライアント認証情報)。さまざまな認証タイプはさまざまなシナリオに適しており、使用する特定の認証タイプはビジネス ニーズに基づいて決定する必要があります。

  1. ロール

OAuth2.0 プロトコルは、リソース所有者、クライアント、リソース サーバーの 3 つのロールを定義します。リソース所有者は承認されたユーザーを指し、クライアントはサードパーティ アプリケーションを指し、リソース サーバーはユーザーのリソースが保存されているサーバーを指します。

  1. プロセス

OAuth2.0 プロトコルのプロセスには次の手順が含まれます。

(1) クライアントはリソース所有者に承認を要求します。

(2) リソース所有者は認可に同意し、クライアントに認可コードを発行します;

(3) クライアントは認可コードを保持してリソース サーバーにアクセス トークンを要求します。

( 4) リソースサーバーは認可コードを検証し、クライアントにアクセストークンを発行します。

2. 実装方法

市場には、Laravel Passport、PHP League OAuth2 Server など、OAuth2.0 プロトコルの実装用の成熟したソリューションが多数存在します。この記事では、PHP リーグ OAuth2 サーバーの実装に焦点を当てます。

  1. 環境セットアップ

まず、新しい PHP プロジェクトを作成し、PHP League OAuth2 Server コンポーネントをインストールする必要があります。インストール方法は次のとおりです。

composer require league/oauth2-server

次に、データベースを作成し、次のテーブル構造を作成する必要があります。

``
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 . '/vendor/autoload.php';

LeagueOAuth2ServerAuthorizationServer を使用;

LeagueOAuth2ServerResourceServer を使用;
LeagueOAuth2ServerGrantClientCredentialsGrant を使用する;
LeagueOAuth2ServerGrantPasswordGrant を使用する;
LeagueOAuth2ServerGrantAuthCodeGrant を使用する;
LeagueOAuth2ServerGrantImplicitGrant を使用する;
LeagueOAuth2ServerRepositories{AccessTokenRepositoryInterface,

AuthCodeRepositoryInterface,
ClientRepositoryInterface,
RefreshTokenRepositoryInterface,
UserRepositoryInterface};

を使用する LeagueOAuth2Server{ResourceServer, AuthorizationValid を使用するatorsBearerTokenValidator};

// サーバーを構成します

$server = new AuthorizationServer(

$clientRepository,
$accessTokenRepository,
$scopeRepository,
$privateKey,
$publicKey

);

// 承認タイプを構成します

$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')
)

);

//リソース サーバーを構成します

$resourceServer = new ResourceServer(

$accessTokenRepository,
$publicKey

);

//BearerTokenValidator を構成します

$bearerTokenValidator = new BearerTokenValidator(

$accessTokenRepository,
$publicKey

);

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

3. 执行授权请求

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

use PsrHttpMessageServerRequestInterface;

use PsrHttpMessageResponseInterface;

// 承認リクエストを処理します

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

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

4. 请求受保护的资源

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

// ベアラー トークンを確認

try {

$bearerTokenValidator->validateAuthorization($request);

} catch (Exception $e) {

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

}

// リクエスト ヘッダーのアクセス トークンを処理します

$accessToken = $request->getHeader('Authorization')[0];
$accessToken = substr($accessToken, strpos($accessToken, ' ' ) 1);

//アクセス トークンを確認

try {

$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);

}

rree

以上がPHP を使用して OAuth2.0 を実装する最良の方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。