摘要:原因使用簡(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)用
有 1 個(gè)你關(guān)注的人連接
將允許人間進(jìn)行以下操作:
- 獲得你的個(gè)人信息,好友關(guān)系
- 分享內(nèi)容到你的微博
- 獲得你的評(píng)論
"/>
"/>
"/>
"/>
"/>
"/>
- $(document).ready(function(){
- $(".WB_btn_link").click(function(){
- $("#authZForm").submit();
- });
- })
TokenAction()
</>code
/**
* 返回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() 代碼
</>code
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
</>code
{
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://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
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要