摘要:原因使用簡(jiǎn)單,可以很快上手,文檔齊全,功能完善。請(qǐng)求,端對(duì)應(yīng)的模板里是告知用戶,即將授予的權(quán)限列表,以及是否允許授權(quán)的按鈕。請(qǐng)求,端獲取用戶資源各種授權(quán)類型,都可以很方便支持。
前奏
系統(tǒng):Ubuntu 語(yǔ)言:PHP7 框架:YAF OAuth2.0:bshaffer/oauth2-server-php
OAuth2.0 有很多開源代碼庫(kù)
Github 排名前兩位
thephpleague/oauth2-server bshaffer/oauth2-server-php
本文使用的是第二個(gè):bshaffer。原因:使用簡(jiǎn)單,可以很快上手,文檔齊全,功能完善。
wiki: https://bshaffer.github.io/oa...
github: https://github.com/bshaffer/o...
引入 OAuth2.0 的 Server 端源代碼
編輯 Composer.json 文件
{ "require": { "bshaffer/oauth2-server-php" : "v1.10.0" } }
yaf框架結(jié)構(gòu)
├── application │ └── modules │ └── User │ ├── controllers │?? │ └── Oauth.php │ └── views │ └── oauth │ ├── authorize.php │ ├── auth.php │ ├── index.php │ └── resource.php ├── Bootstrap.php ├── cli ├── composer.json ├── composer.lock ├── composer.phar ├── conf ├── docs ├── public └── vendor
Yaf 框架中,在 Bootstrap.php 文件中自動(dòng)加載 OAuth2.0
public function _initLoader(Yaf_Dispatcher $dispatcher) { include(APP_PATH . "/vendor/autoload.php"); }
新建一個(gè) Controller 文件:Oauth.php,在里面建立幾個(gè) Action
AuthorizeAction() 服務(wù)端:提供授權(quán) TokenAction() 服務(wù)端:提供Token ResourceAction() 服務(wù)端:提供資源 IndexAction() 客戶端:模擬第三方接入 _server() 服務(wù)端:初始化服務(wù)器相關(guān),如:存儲(chǔ),這里采用mysql
命名空間
use OAuth2Server; use OAuth2StoragePdo; use OAuth2GrantTypeAuthorizationCode; use OAuth2GrantTypeClientCredentials; use OAuth2GrantTypeUserCredentials; use OAuth2Request; use OAuth2Response;
_server() 函數(shù)代碼
private function _server() { $dbParams = array( "dsn" => "mysql:host=127.0.0.1;port=3306;dbname=oauth;charset=utf8;", "username" => "root", "password" => "123456", ); // $dsn is the Data Source Name for your database, for exmaple "mysql:dbname=my_oauth2_db;host=localhost" $storage = new Pdo($dbParams); // Pass a storage object or array of storage objects to the OAuth2 server class $server = new Server($storage); // Add the "Client Credentials" grant type (it is the simplest of the grant types) $server->addGrantType(new ClientCredentials($storage)); // Add the "Authorization Code" grant type (this is where the oauth magic happens) $server->addGrantType(new AuthorizationCode($storage)); return $server; }
IndexAction() 代碼
public function indexAction() { $uri = $_SERVER["QUERY_STRING"]; $code = substr($uri, strpos($uri, "code=")+5, 40); $state = substr($uri, strpos($uri, "state=")+6); if ($code) { $params = array( "code" => $code, "state" => $state, "client_id" => "client_id", "client_secret" => "client_secret", "grant_type" => "authorization_code", "scope" => "basic", "redirect_uri" => "http://yourhost/user/oauth/index", ); $url = "http://yourhost/user/oauth/token"; $result = $this->httpPost($url, $params); $result = json_decode($result, true); //寫入Session,便于測(cè)試 Yaf_Session::getInstance()->set("access_token",$result["access_token"]); return false; } else { //客戶端請(qǐng)求授權(quán)之前,頁(yè)面中展示一個(gè)鏈接,用戶點(diǎn)后,可以跳轉(zhuǎn)至服務(wù)端的授權(quán)頁(yè)面。 $this->getView()->assign("data", array())->render("oauth/index.php"); } }
對(duì)應(yīng)的模板代碼:oauth/index.php
AuthorizeAction() 代碼
/** * 展示授權(quán)頁(yè)面,用戶可以點(diǎn)擊同意進(jìn)行授權(quán) */ public function AuthorizeAction() { $request = Request::createFromGlobals(); $is_authorized = $request->request("is_authorized") ? true : false; //判斷用戶是否同意授權(quán) if ($is_authorized) { $response = new Response(); $server = $this->_server(); // validate the authorize request if (!$server->validateAuthorizeRequest($request, $response)) { $response->send(); die; } $server->handleAuthorizeRequest($request, $response, $is_authorized)->send(); return false; } //將請(qǐng)求授權(quán)中帶來(lái)的各個(gè)參數(shù),寫入授權(quán)頁(yè)中的變量,用以授權(quán)表單POST提交。 $renderData = $_GET; $this->getView()->assign("data", $renderData)->render("oauth/authorize.php"); }
用戶授權(quán)頁(yè)面:oauth/authorize.php
直達(dá)天庭 - 南天門 天庭
哪吒 |我的應(yīng)用
TokenAction()
/** * 返回JSON結(jié)構(gòu)數(shù)據(jù) * { access_token: "977b1077556e9b23ff07ef7606a5eaf947f27d41", expires_in: 3600, token_type: "Bearer", scope: "basic", refresh_token: "d2367887bdd743121adfe5fda5083064439f1cb1" } */ public function TokenAction() { $server = $this->_server(); $server->handleTokenRequest(Request::createFromGlobals())->send(); return false; }
ResourceAction() 代碼
public function ResourceAction() { $server = $this->_server(); //獲取授權(quán)用戶Session中保存的access_token,用access_token可以請(qǐng)求權(quán)限范圍內(nèi)的所有接口 $_POST["access_token"] = Yaf_Session::getInstance()->get("access_token"); // Handle a request to a resource and authenticate the access token if (!$server->verifyResourceRequest(Request::createFromGlobals())) { $server->getResponse()->send(); die; } echo json_encode(array("success" => true, "message" => "You accessed my APIs!")); return false; }
請(qǐng)求用戶資源:/user/oauth/resource
{ success: true, message: "You accessed my APIs!" }
實(shí)現(xiàn)思路:
URL請(qǐng)求:/user/oauth/index,Client端
對(duì)應(yīng)的模板里放置一個(gè)鏈接,用以跳轉(zhuǎn)至服務(wù)端的授權(quán)認(rèn)證頁(yè)面/user/oauth/authorize。授權(quán)成功后,服務(wù)端會(huì)將對(duì)應(yīng)的code和state參數(shù),附在回調(diào)的redirect_uri里,即:/user/oauth/index?code=fcd6a9589e7ab43398e4e5349b23846babc79fab&state=xxx,在indexAction中解析出回調(diào)的code,用以請(qǐng)求接口/user/oauth/token,來(lái)交換access_token。
URL請(qǐng)求:/user/oauth/authorize,Server端
對(duì)應(yīng)的模板里是告知用戶,即將授予的權(quán)限列表,以及是否允許授權(quán)的按鈕。
URL請(qǐng)求:/user/oauth/token,Server端
獲取access_token。
URL請(qǐng)求:/user/oauth/resource,Server端
獲取用戶資源
LAST:
各種授權(quán)類型,都可以很方便支持。
數(shù)據(jù)存儲(chǔ)層,也可以隨意切換,比如切換為 Redis
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/28165.html
摘要:前言從零開始用搭建一個(gè)網(wǎng)站三介紹了網(wǎng)頁(yè)前端與后端前端與前端之間數(shù)據(jù)的交流。作者極光為極光團(tuán)隊(duì)賬號(hào),歡迎關(guān)注原文從零開始用搭建一個(gè)網(wǎng)站四知乎專欄極光日?qǐng)?bào) 前言 從零開始用 Flask 搭建一個(gè)網(wǎng)站(三) 介紹了網(wǎng)頁(yè)前端與后端、前端與前端之間數(shù)據(jù)的交流。本節(jié)主要介紹一下如何應(yīng)用 Flask-OAuthlib, 使用 Flask-OAuthlib 就可以輕松地請(qǐng)求第三方應(yīng)用提供的 API 。...
摘要:服務(wù)器將要監(jiān)聽的端口不要使用服務(wù)進(jìn)行注冊(cè)不要在本地緩存注冊(cè)表信息使用一個(gè)新的注解,就可以讓我們的服務(wù)成為一個(gè)服務(wù)服務(wù)發(fā)現(xiàn)客戶端配置以為例需要做件事情成為服務(wù)發(fā)現(xiàn)的客戶端配置對(duì)應(yīng)來(lái)說(shuō)我們只需要配置如下啟動(dòng)運(yùn)行查看。 Spring簡(jiǎn)介 為什么要使用微服務(wù) 單體應(yīng)用: 目前為止絕大部分的web應(yīng)用軟件采用單體應(yīng)用,所有的應(yīng)用的用戶UI、業(yè)務(wù)邏輯、數(shù)據(jù)庫(kù)訪問(wèn)都打包在一個(gè)應(yīng)用程序上。 showI...
摘要:目前的版本是版,本文將對(duì)的一些基本概念和運(yùn)行流程做一個(gè)簡(jiǎn)要介紹。只要有一個(gè)第三方應(yīng)用程序被破解,就會(huì)導(dǎo)致用戶密碼泄漏,以及所有被密碼保護(hù)的數(shù)據(jù)泄漏。運(yùn)行流程客戶端向資源所有者請(qǐng)求授權(quán)。 OAuth(開放授權(quán))是一個(gè)關(guān)于授權(quán)的開放標(biāo)準(zhǔn),允許用戶讓第三方應(yīng)用訪問(wèn)該用戶在某一網(wǎng)站上存儲(chǔ)的私密的資源(如照片,視頻,聯(lián)系人列表),而無(wú)需將用戶名和密碼提供給第三方應(yīng)用。目前的版本是2.0版,本文將...
閱讀 3564·2023-04-25 16:35
閱讀 701·2021-10-11 11:09
閱讀 6170·2021-09-22 15:11
閱讀 3357·2019-08-30 14:03
閱讀 2598·2019-08-29 16:54
閱讀 3350·2019-08-29 16:34
閱讀 3056·2019-08-29 12:18
閱讀 2130·2019-08-28 18:31