この記事の内容は、ThinkPHP5 の Auth2 を使用した検証プロセスの分析を共有することです。困っている友人は参考にしてください。また、皆さんのお役に立てれば幸いです。
tp に実装された auth2 検証に関しては、yii とは異なり、インターネット上でメモがほとんど見つかりませんでした。そのため、関連するニーズを持つ友人を助けるためにここにいくつかのメモを投稿します
PS: oauth2 には 4 つのソリューションがあります。この例はクライアントの資格情報に基づいています。他の 3 つは説明しません。
1.composer によるインストール
composer require --prefer-dist bshaffer/oauth2 -server-php
インストールが完了すると、図に示すように、
#関連するディレクトリが表示されます
2。認可ファイルの実装
1) 対応するデータ テーブルの作成
まず、図に示すように Pdo.php ファイルを見つけます。
##次に場所を見つけます
目的、
はテーブルを作成するときに名前を伝えるためのもので、ここで使用されるテーブル名は同じである必要があります。
作成したテーブルについては、コードを直接アップロードするので、コピーして使用できます。直接貼り付けます:CREATE TABLE oauth_access_tokens ( access_token varchar(40) NOT NULL, client_id varchar(80) NOT NULL, user_id int(11) DEFAULT NULL, expires varchar(19) NOT NULL, scope text, PRIMARY KEY ( access_token ), KEY fk_access_token_oauth2_client_client_id ( client_id ), KEY ix_access_token_expires ( expires ), CONSTRAINT fk_access_token_oauth2_client_client_id FOREIGN KEY ( client_id ) REFERENCES pos_oauth2_client ( client_id ) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE oauth_authorization_codes ( authorization_code varchar(40) NOT NULL, client_id varchar(80) NOT NULL, user_id int(11) DEFAULT NULL, redirect_uri text NOT NULL, expires int(11) NOT NULL, scope text, PRIMARY KEY ( authorization_code ), KEY fk_authorization_code_oauth2_client_client_id ( client_id ), KEY ix_authorization_code_expires ( expires ), CONSTRAINT fk_authorization_code_oauth2_client_client_id FOREIGN KEY ( client_id ) REFERENCES pos_oauth2_client ( client_id ) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE oauth_clients ( client_id varchar(80) NOT NULL, client_secret varchar(80) NOT NULL, redirect_uri text NOT NULL, grant_type text, scope text, created_at int(11) DEFAULT NULL, updated_at int(11) DEFAULT NULL, created_by int(11) DEFAULT NULL, updated_by int(11) DEFAULT NULL, PRIMARY KEY ( client_id ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE oauth_refresh_tokens ( refresh_token varchar(40) NOT NULL, client_id varchar(80) NOT NULL, user_id int(11) DEFAULT NULL, expires int(11) NOT NULL, scope text, PRIMARY KEY ( refresh_token ), KEY fk_refresh_token_oauth2_client_client_id ( client_id ), KEY ix_refresh_token_expires ( expires ), CONSTRAINT fk_refresh_token_oauth2_client_client_id FOREIGN KEY ( client_id ) REFERENCES pos_oauth2_client ( client_id ) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE oauth_scopes ( scope text, is_default tinyint(1) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8;データの一部を追加します
insert into oauth_clients ( client_id, client_secret, redirect_uri, grant_type, scope, created_at, updated_at, created_by, updated_by ) values ('admin','123456','http://','client_credentials',NULL,NULL,NULL,NULL,NULL);PS、図に示すように説明してください:
私の実際の使用では、これら 5 つのテーブルのみを使用します。つまり、この構成では、上で作成した 5 つのテーブルについて、残りのオプションをすべてログアウトしました。
説明したい別の状況があります: おそらく皆さん、テーブル プレフィックスがデータ テーブルに設定されており、関連する変更をここで行う必要があります。たとえば、私が作成しました。図を参照してください。 :
そこで、関連する変更を加えました:
2) 認証ファイル Oauth2.php を作成し、任意の名前を付けます。
<?phpnamespace appcommon;/** @author jinyan @create 20180416 */use OAuth2StoragePdo;use thinkConfig; class Oauth2{
/** * @Register new Oauth2 apply * @param string $action * @return boolean|\OAuth2\Server */ function grantTypeOauth2($action=null) { Config::load(APP_PATH.'database.php'); $storage = new Pdo( [ 'dsn' => config('dsn'), 'username' => config('username'), 'password' => config('password') ] ); $server = new \OAuth2\Server($storage, array('enforce_state'=>false)); // Add the "Client Credentials" grant type (it is the simplest of the grant types) $server->addGrantType(new \OAuth2\GrantType\ClientCredentials($storage)); // Add the "Authorization Code" grant type (this is where the oauth magic happens) $server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($storage)); // Add the "User Credentials" grant type (this is where the oauth magic happens) $server->addGrantType(new \OAuth2\GrantType\UserCredentials($storage)); return $server; } /** * @校验token值 * @param unknown $server */ protected function checkApiAuthroize($server) { if (!$server->verifyResourceRequest(\OAuth2\Request::createFromGlobals())) { $server->getResponse()->send(); exit; } }
} ?>
3) トークン ファイルを作成します。 Access.php
<?phpnamespace apprestfulcontroller;use appcommonOauth2; /** @uathor:jinyan */ class Access extends Oauth2{
protected $_server; /** * @授权配置 */ public function __construct() { return $this->_server = $this->grantTypeOauth2(); } /** * */ private function _token() { // Handle a request for an OAuth2.0 Access Token and send the response to the client $this->_server->handleTokenRequest(\OAuth2\Request::createFromGlobals())->send('json', 'oauth2_'); } /** * @get access_token */ public function access_token() { $this->_token(); }
} ?>では、access_token 値をリクエストするにはどうすればよいでしょうか? access_token() メソッドを直接呼び出すだけです。リクエスト URL: http://restful.thinkphp.com/r...データ テーブルを作成するときに、新しいデータを取得する前に何か追加してください。データの一部?その機能は、access_token のアカウント パスワードを取得するのと同じです。必ず Post メソッドを使用してトークンを取得してください。リクエストのパラメータ
{ client_id=admin client_secret=123456 grant_type=client_credentials //这个参数是固定的 }リクエストが成功すると、次のようになります。図に示すように、次のように返されます:
ff ブラウザのリクエスト インターフェイスを介して貼り付けます httprequest:
##4) access_token,Sms.php
<?php namespace apprestfulcontroller; /** Created by PhpStorm. User: Administrator Date: 2018/7/29 Time: 22:02 */ use appcommonOauth2; class Sms extends Oauth2 { protected $_server; /** * @授权配置 */ public function __construct() { $this->_server = $this->grantTypeOauth2(); } public function test() { //access_token验证 $this->checkApiAuthroize($this->_server); echo '成功请求到数据'; } }
3 を通じてインターフェイス データを取得します。テストの効果は図に示すとおりです。 :
1) まず、access_token リクエストを使用せずに、test() メソッドを実行します:結果は 401 未検証ですstatus 2) 次に、間違った access_token をリクエストします。test() メソッド
も 401 ステータスですが、この時点では、図に示されています
私たちに情報が返されています
3) 最後に、正しい情報を使用してください。 access_token、test() メソッド
したがって、1 番目と 2 番目の状況に基づいて、図に示すように、トークン検証の失敗方法をカスタマイズする必要があります。
# # ############################################### 終わり。
おすすめ関連記事:
あらゆるタイプのクレジット カード クラスを検証するための php 実装
thinkphp 検証コードの実装 ( フォーム、ajax実装検証)_php example以上がThinkPHP5 の Auth2 を使用した検証プロセスの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。