在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, 名字隨便自己取
namespace appcommon;
/**
@author jinyan
@create 20180416
*/
use OAuth2StoragePdo;
use thinkConfig;
class Oauth2
{
/** * @Register new Oauth2 apply * @param string $action * @return boolean|OAuth2Server */ function grantTypeOauth2($action=null) { Config::load(APP_PATH."database.php"); $storage = new Pdo( [ "dsn" => config("dsn"), "username" => config("username"), "password" => config("password") ] ); $server = new OAuth2Server($storage, array("enforce_state"=>false)); // Add the "Client Credentials" grant type (it is the simplest of the grant types) $server->addGrantType(new OAuth2GrantTypeClientCredentials($storage)); // Add the "Authorization Code" grant type (this is where the oauth magic happens) $server->addGrantType(new OAuth2GrantTypeAuthorizationCode($storage)); // Add the "User Credentials" grant type (this is where the oauth magic happens) $server->addGrantType(new OAuth2GrantTypeUserCredentials($storage)); return $server; } /** * @校驗token值 * @param unknown $server */ protected function checkApiAuthroize($server) { if (!$server->verifyResourceRequest(OAuth2Request::createFromGlobals())) { $server->getResponse()->send(); exit; } }
}
?>
3) 創建token文件, Access.php
namespace 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(OAuth2Request::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=admin client_secret=123456 grant_type=client_credentials //這個參數是固定的
}
如果請求成功的話,會返回如下圖所示:
貼上,通過ff瀏覽器httprequest的請求界面:
4) 通過 access_token 獲取接口數據 ,Sms.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 "成功請求到數據"; }
}
三、 測試效果如圖:
1)首先不帶access_token請求, test()方法:
結果出現一個401未驗證通過的狀態
2)然后請求一個錯誤的access_token, test()方法
同樣是一個401的狀態,但此時,如圖
有信息返回給我們
3) 最后,使用一個正確的access_token, test()方法
所以,基于第1種情況和第2種情況,你應該自定一個token未驗證成功的方法,如圖:
完結。
如有疑問需解答, 請加學習群 2751786, 謝謝
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29148.html
vue調用用在很多場景,今天為大家介紹如何用谷歌授權登錄獲取用戶通訊錄 當前背景 業務端要求,用戶本人填寫信息,推薦到朋友,要求可以導出用戶谷歌郵箱的通訊錄,讓用戶選擇,并且回顯到頁面 ##步驟 在谷歌開發者平臺, 創建一個項目,我的理解是,我們的頁面就是這個項目,要由我們的項目,對谷歌發起授權請求,就類似微信小程序,向官方發起授權,請求昵稱和頭像的這個場景,所以,后面我們的這個項目也要...
摘要:即基于拿來即用高性能后臺管理系統官方文檔地址在線體驗地址賬戶密碼線上倉庫在線地址源代碼下載克隆直接下載本地部署運行環境要求建議配置虛擬域名若不清楚,請自行解決之,方便接下來開展你的開發工作。 新版本在線體驗地址已經上線,歡迎體驗? ---2017-01-14 喜歡就Star,不只是Fork; 想要分享的動機才是驅動力,而技術僅僅是一種方法。 ====================...
摘要:即基于拿來即用高性能后臺管理系統官方文檔地址在線體驗地址賬戶密碼線上倉庫在線地址源代碼下載克隆直接下載本地部署運行環境要求建議配置虛擬域名若不清楚,請自行解決之,方便接下來開展你的開發工作。 新版本在線體驗地址已經上線,歡迎體驗? ---2017-01-14 喜歡就Star,不只是Fork; 想要分享的動機才是驅動力,而技術僅僅是一種方法。 ====================...
摘要:數據庫文件已經上傳,安裝配置就可以使用簡稱即基于的后臺管理系統官方文檔地址在線體驗地址賬戶密碼線上倉庫在線地址源代碼下載克隆直接下載本地部署運行環境要求建議配置虛擬域名若不清楚,請自行解決之,方便接下來開展你的開發工作。 喜歡就Star,不只是Fork; 想要分享的動機才是驅動力,而技術僅僅是一種方法。 數據庫文件已經上傳,安裝配置就可以使用 showImg(https://seg...
閱讀 3960·2021-11-24 09:38
閱讀 1225·2021-10-19 11:42
閱讀 1829·2021-10-14 09:42
閱讀 2154·2019-08-30 15:44
閱讀 544·2019-08-30 14:04
閱讀 2888·2019-08-30 13:13
閱讀 1949·2019-08-30 12:51
閱讀 956·2019-08-30 11:22