ThinkPHP5中使用 Auth2進行驗證的過程分析

來源:互聯網
上載者:User
本篇文章給大家分享的內容是關於ThinkPHP5中使用 Auth2進行驗證的過程分析,有需要的朋友可以參考一下,希望能協助到大家。

在tp上實現的auth2驗證的,在網上發現筆記很少, 不像yii, 故在此發表一下筆記,用來協助有相關需求的朋友

PS: 鑒於oauth2有四種方案, 本執行個體是基於 用戶端憑證 實現,其他三種就不講述了

一、通過composer安裝

composer require --prefer-dist bshaffer/oauth2-server-php

安裝完成後,

會出現相關的目錄

二、實現授權檔案

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,說明一下,

在我實際使用中,只使用到這五張表,也就是上面建立的五張表,在這個config裡面,剩下的幾個選項我是全部 登出掉了的

另外還有一個情況,說明一下: 有可能各位,對資料表設定了表首碼, 也是需要在此進行相關修改的, 比如我建立的,見圖:

所以我進行了相關的修改:

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) 建立token檔案, 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的值呢? 直接調用這個 acccess_token()的方法即可

request url: http://restful.thinkphp.com/r...

還請得之前建立資料表時,有添加了一條新資料嗎? 其作用就是相當於用來擷取access_token的帳號密碼之類的, 記得需要使用 Post方式擷取token

請求的參數

{client_id=adminclient_secret=123456grant_type=client_credentials //這個參數是固定的}

如果請求成功的話,會返回如所示:

貼上,通過ff瀏覽器httprequest的請求介面:

4) 通過 access_token 擷取介面資料 ,Sms.php

<?phpnamespace apprestfulcontroller;/**Created by PhpStorm.User: AdministratorDate: 2018/7/29Time: 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 '成功請求到資料';}}

三、 測試效果

1)首先不帶access_token請求, test()方法:

結果出現一個401未驗證通過的狀態

2)然後請求一個錯誤的access_token, test()方法


同樣是一個401的狀態,但此時,

有資訊返回給我們

3) 最後,使用一個正確的access_token, test()方法

所以,基於第1種情況和第2種情況,你應該自定一個token未驗證成功的方法,

完結。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.