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

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

王林
リリース: 2023-06-08 09:10:02
オリジナル
1873 人が閲覧しました

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート