国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) php教程 php手冊(cè) 使用 OAuth2-Server-php 在 Yii 框架上搭建 OAuth2 Server

使用 OAuth2-Server-php 在 Yii 框架上搭建 OAuth2 Server

Aug 18, 2016 am 08:57 AM

原文轉(zhuǎn)自?http://www.cnblogs.com/ldms/p/4565547.html

?

Yii 有很多 extension 可以使用,在查看了 Yii 官網(wǎng)上提供的與 OAuth 相關(guān)的擴(kuò)展後,發(fā)現(xiàn)了幾個(gè) OAuth2 的客戶端擴(kuò)展,但是並沒(méi)有找到可以作為 OAuth2 Server 的擴(kuò)展。因?yàn)?Yii 是組織良好的易於擴(kuò)展的框架,所以完全可以整合其它的 PHP OAuth2 Server 實(shí)作方案。在 OAuth.net/2/ 官網(wǎng)上,提供了幾個(gè) PHP 實(shí)作的 OAuth2 Server。這裡使用第一個(gè) OAuth2-Server-php 來(lái)作為 Yii 框架的 OAuth2 Server 擴(kuò)展,需要一些必要的整合操作,主要是編寫一個(gè)類別來(lái)接受 client 存取和頒發(fā) access_token 等。

第一部分: 資料庫(kù)準(zhǔn)備

??? OAuth2-Server-php? 使用的資料庫(kù)結(jié)構(gòu)採(cǎi)用Github 上的oauth2-server-php README.md 提供的表格結(jié)構(gòu)(Schema),總共有五張表:
my??;
??? +--------------------------+
? ? | Tables_in_oauth2 ? ? ? ? |
??? +-------------- ------------+
??? | oauth_access_token?????? |
??? | oauth_authorization_code |
??? | oauth?????? |
??? | user??????????????????????-----------+
??? 5 rows in set (0.00 sec)
????
??? 各表的名字說(shuō)明了表中存取的內(nèi)容,且表名可自訂,自訂位置為:OAuth2/Storage /Pdo.php 48行的config 陣列中,因?yàn)檫@裡採(cǎi)用的是mysql 資料庫(kù),所以需要修改的是Pdo,若是採(cǎi)用其它的儲(chǔ)存方案,如Redis,則自行修改對(duì)應(yīng)檔案即可。注意這裡的資料庫(kù)名稱是都是單數(shù)形式。

??? 使用下列sql 語(yǔ)句建立這5個(gè)表,並新增一個(gè)測(cè)試client:
??? ###################################################################################################################################################################################
??? ### oauth2 tables
??? ##############################
???if exists `oauth_access_token`;
??? drop table if exists `oauth_authorization_code`;
??? drop table if exists `oauth_refesh_token`s 3op table exists `oauthfrem _token`s pideo;?? CREATE TABLE `oauth_client` (
??? `client_id` VARCHAR(80) NOT NULL,?
??? `client_secret` VARCHAR(80) NOT NULL,?
??? `redirect_uri` VARCHAR(2000) NOT NULL,??
??? CREATE TABLE `oauth_access_token` (
??? `access_token` VARCHAR(40 ) NOT NULL,?
??? `client_id` VARCHAR(80) NOT NULL,?
??? `user_id` VARCHAR(255),?
??? `expires` VARCHAR(255),?
??? `expires` TIMEST)
??? CONSTRAINT access_token_pk PRIMARY KEY (access_token)
);

??? CREATE TABLE `oauth_authorization_code` (
??? `authorization_code` VARCHAR(40) NOT NULL,?
??),?
??? `redirect_uri` VARCHAR(2000),
??? `expires` TIMESTAMP NOT NULL,?
??? `scope` VARCHAR(2000),?
??? CONSTRAINT auth_code_pk PRIMARY KEY (??? CONSTRAINT)?`oauth_refresh_token` (
??? `refresh_token` VARCHAR(40) NOT NULL,?
??? `client_id ` VARCHAR(80) NOT NULL,?
??? `user_id` VARCHAR(255),?
??? `expires` TIMESTAMP NOT NULL,?
??Y KEY (refresh_token)
??? );

??? --?
CREATE TABLE `user` (
??? `user_id` INT(11) NOT NULL AUTO_INCREMENT,
??? `username` VARCHAR(255) NOT NULL,?
?CHAR(255),?
??? `last_name ` VARCHAR(255),?
??? CONSTRAINT user_pk PRIMARY KEY (user_id)
??? );
-- test data
??? INSERT INTO oauth_client (client_id, client_secret, redirect_uri)?
??? ??? VALUES ("test?name)?
VALUES ('rereadyou', '8551be07bab21f3933e8177538d411e43b78dbcc', 'bo', 'zhang');


第二部分: 認(rèn)證方案及實(shí)現(xiàn)了這一點(diǎn)方案以及它們?cè)诒緦?shí)作中的使用方式進(jìn)行分別說(shuō)面。

第一種認(rèn)證方式: Authorization Code Grant (授權(quán)碼認(rèn)證)

??? 授權(quán)碼透過(guò)使用授權(quán)伺服器做為客戶端與資源擁有者的中介而取得??蛻舳瞬皇侵苯訌馁Y源擁有者請(qǐng)求授權(quán),而是引導(dǎo)資源擁有者至授權(quán)伺服器(由RFC2616定義的使用者代理),授權(quán)伺服器之後引導(dǎo)資源擁有者帶著授權(quán)碼回到客戶端。

??? 在引導(dǎo)資源擁有者攜帶授權(quán)碼返回用戶端前,授權(quán)伺服器會(huì)鑑定資源擁有者身分並取得其授權(quán)。由於資源擁有者只與授權(quán)伺服器進(jìn)行身份驗(yàn)證,所以資源擁有者的憑證不需要與客戶端分享。

??? 授權(quán)碼提供了一些重要的安全益處,例如驗(yàn)證客戶端身份的能力,以及向客戶端直接的訪問(wèn)令牌的傳輸而非通過(guò)資源所有者的用戶代理來(lái)傳送它而潛在暴露給他人(包括資源所有者)。

??? 授權(quán)碼授權(quán)類型用於取得存取令牌和刷新令牌並未機(jī)密用戶端進(jìn)行了最佳化。由於這是一個(gè)基於重定向的流程,客戶端必須能夠與資源所有者的使用者代理(通常是網(wǎng)頁(yè)瀏覽器)進(jìn)行互動(dòng)並能夠接收來(lái)自授權(quán)伺服器的傳入請(qǐng)求(透過(guò)重定向)。

? Authorization Code Grant 流程(又稱Web Server Flow) 請(qǐng)參閱如下:
??? ?+----------+
??? ?| Resource |????|
??? ?+------- ---+
??? ????? ^
??? ????? |
??? ???? (B)?+---------------+
??? ?| ? ? ? ? ?+--- -(A)-- & Redirection URI ---->|?????????????? |
??? ?|? User-?? |????????? | Authorization |
??? ?|? Agent ? +----(B)-- User authenticates --->|???? Server??????????????????????????? | |
??? ?| ? ? ? ? ?+----(C)-- Authorization Code ---??? ?? |??? |?????????????????????????? ? (A)? (C)???????????????????????????????? |?????????????????????????????????????????????????????????????????????????????????????????????????? |???????? |
??? ?| Client |????????? & Redirection URI????????????????? |
????????????????????????????????? |
??? ?--------+?????? (w/ Optional Refresh Token)

??? 注意:說(shuō)明步驟(A)、(B)和(C)的直線因?yàn)橥高^(guò)使用者代理而分為兩部分。
??? 圖1:授權(quán)碼流程

??? 圖1所示的流程包括下列步驟:

???(A)用戶端透過(guò)向授權(quán)端點(diǎn)引導(dǎo)資源擁有者的使用者代理程式開(kāi)始流程??蛻舳税ㄋ目蛻舳藰?biāo)識(shí)、請(qǐng)求範(fàn)圍、本地狀態(tài)和重定向URI,一旦存取被許可(或拒絕)授權(quán)伺服器將傳送用戶代理回到該URI。
??? (B)授權(quán)伺服器驗(yàn)證資源擁有者的身分(透過(guò)使用者代理),並決定資源擁有者是否授予或拒絕客戶端的存取請(qǐng)求。
??? (C)假設(shè)資源擁有者許可訪問(wèn),授權(quán)伺服器使用之前(在請(qǐng)求時(shí)或客戶端註冊(cè)時(shí))提供的重定向URI重定向用戶代理回到客戶端。重定向URI包括授權(quán)碼和先前客戶端提供的任何本地狀態(tài)。
??? (D)用戶端透過(guò)包含上一個(gè)步驟中收到的授權(quán)碼從授權(quán)伺服器的令牌端點(diǎn)請(qǐng)求存取令牌。當(dāng)發(fā)起請(qǐng)求時(shí),客戶端與授權(quán)伺服器進(jìn)行身份驗(yàn)證。客戶端包含用於獲得授權(quán)碼的重定向URI來(lái)用於驗(yàn)證。
??? (E)授權(quán)伺服器對(duì)客戶端進(jìn)行身份驗(yàn)證,驗(yàn)證授權(quán)代碼,並確保接收的重定向URI與在步驟(C)中用於重定向客戶端的URI相匹配。如果通過(guò),授權(quán)伺服器回應(yīng)傳回存取權(quán)杖與可選的刷新令牌。

??? 流程實(shí)作:
??? 1.??? client app 使用app id 取得authorization code:

??? www.yii.com/oauth2/index.

??? www.yii.com/oauth2/index.

??? www.yii.com/oauth2/index。
??? 返回:$authcode = authorization code.
??? Tips: ??? authorization code will expired in 30s,可修改OAuth2/ResponseType/AuthorizationCode.php 中的AuthorizationCode class 的建構(gòu)方法配置參數(shù)來(lái)自訂authorization_code 有效時(shí)間。
??? client_id 是先前註冊(cè)在本 Server 上的應(yīng)用程式名稱,這屬於用戶端管理範(fàn)疇。?
??? 這一步驟需要進(jìn)行使用者(資源擁有者)登入 OAuth2 Server 來(lái)完成授權(quán)作業(yè)。使用者登入屬使用者管理範(fàn)疇,不屬 OAuth2 Server 中應(yīng)編寫的功能。
??? 使用者登入後可選擇可至 client app 開(kāi)放的作業(yè)(授權(quán))。
??? 這一步驟綁定過(guò)程中,從安全角度來(lái)考慮應(yīng)強(qiáng)制使用者重新輸入使用者名稱密碼確認(rèn)綁定,不要直接讀取目前使用者session進(jìn)行綁定。?

??? 2. 取得 access_token:
?????? client app 使用 authorization code 換取 access_token

curl -u testclient:testpass www.yii.com/oauth2/index.php?r=oauth2/token -d "grant_type=authorization_code&code=$authcode

??????ken":"aea4a1059d3194a3dd5e4117bedd6e07ccc3f402",
"expires_in":3600,
??? ??? ?"token_type":"bearer",
??? ??? ?"scope":null,
??? ??? ?"refresh_token":"269a623f54171e8598b1852eefcf115f4882b820"
??? ??? }

??? ??? 失敗:
??? ????{"error":"invalid_grant",
??? ??? ?"error_description" :"Authorization code doesn't exist or is invalid for the client"
??? ??? }

??? Tip: 本步驟中需要使用客戶端的client_id 和access_tokne 有效期限為3600s, refresh_token 有效期限為1209600s,可在OAuth2/ResponseType/AccessToken.php 的AccessToken class 中的建構(gòu)函式設(shè)定中進(jìn)行修改。
????
????

???卡(它不支援發(fā)行刷新令牌),並對(duì)知道操作特定重定向URI的公共用戶端進(jìn)行最佳化。導(dǎo)向的流程,用戶端必須能夠與資源擁有者的使用者代理程式(通常是Web瀏覽器)進(jìn)行互動(dòng)並能夠接收來(lái)自授權(quán)伺服器的傳入請(qǐng)求(透過(guò)重新導(dǎo)向)。存取權(quán)杖的授權(quán)碼許可類型,用戶端收到存取權(quán)杖作為授權(quán)請(qǐng)求的結(jié)果。

??? 隱式授權(quán)類型不包含用戶端身分驗(yàn)證而依賴資源擁有者在場(chǎng)和重新導(dǎo)向URI的註冊(cè)。因?yàn)榇嫒?quán)杖被編碼到重定向URI中,它可能會(huì)暴露給資源所有者和其他駐留在相同裝置上的應(yīng)用程式。

??? 採(cǎi)用Implicit Grant方式取得Access Token的授權(quán)驗(yàn)證流程又稱為User-Agent Flow,適用於所有無(wú)Server端配合的應(yīng)用(由於應(yīng)用往往位於一個(gè)User Agent裡,如瀏覽器裡面,因此這類應(yīng)用器裡面,因此這類應(yīng)用器在某些平臺(tái)下又被稱為Client-Side Application),如手機(jī)/桌面客戶端程式、瀏覽器插件等,以及基於JavaScript等腳本客戶端腳本語(yǔ)言實(shí)現(xiàn)的應(yīng)用,他們的一個(gè)共同特點(diǎn)是,應(yīng)用無(wú)法妥善保管其應(yīng)用程式金鑰(App Secret Key),如果採(cǎi)取Authorization Code模式,則會(huì)有洩漏其應(yīng)用金鑰的可能性。其流程示意圖如下:?

???? +----------+
???? | source |
???? |? Owner????????????? ^
????????? |
???????? (B )
???? +----|-----+????????? Client Identifier???? +---------------+
???? | ?? ??--+
???? | ?->|?????????????? |
???? |? User-?? |??????????|
???? |? Agent ? |----(B)-- User authenticates -->|???? Server??? |
???? |????????????????? |?????????????? |
????????- Redirection URI ----????????? |????????????????? |???????????????????????????----(D)--- 重新導(dǎo)向URI ---->|?? 網(wǎng)路託管|
???? |????????? |???????????????? |?????????????????????????????------------???? |???????????????? +-------------+
???? +-|------- -+
?????? |??? |
????? (A)? (G) 存取令牌
??????????? |???????? |
???? |? 顧客|
???? |???????? |
+--????????? |
+--??---+

???? 註:說(shuō)明步驟(A)和(B)的直線經(jīng)由使用者代理而分成兩部分。

???? 圖2:隱式許可流程

圖2所示的流程包含以下步驟:

??? (A)用戶端透過(guò)向授權(quán)端點(diǎn)引導(dǎo)資源擁有者的使用者代理程式啟動(dòng)流程。客戶端包括其客戶端標(biāo)識(shí)、請(qǐng)求範(fàn)圍、本機(jī)狀態(tài)和重定向URI ,一旦存取被許可(或拒絕)授權(quán)伺服器會(huì)將使用者代理程式傳回該URI。
??? (B)授權(quán)伺服器驗(yàn)證資源擁有者的身分(透過(guò)使用者代理),並決定資源擁有者是否接受或拒絕客戶端的存取要求。
??? (C)假設(shè)資源擁有者許可訪問(wèn),授權(quán)伺服器使用之前(在請(qǐng)求時(shí)或客戶端註冊(cè)時(shí))提供重定向URI用戶代理客戶端返回。重定向URI在URI片段中包含存取權(quán)杖。
??? (D)使用者代理程式順著方向指示向Web託管的用戶端資源發(fā)起請(qǐng)求(按RFC2616該請(qǐng)求不包含片段)。用戶代理在本地保留片段資訊。
??? (E)Web託管的客戶端資源返回一個(gè)網(wǎng)頁(yè)(通常是帶有嵌入式腳本的HTML 文件),該網(wǎng)頁(yè)能夠包含訪問(wèn)用戶代理、保留片段的完整重定向URI 並提取包含在片段中參數(shù)的訪問(wèn)令牌(和)。
其他??? (F )使用者代理程式在本地執(zhí)行Web託管的用戶端資源提供提取存取權(quán)杖的腳本。
??? (G)使用者代理程式傳送存取令牌給客戶端。

???? Tips: 1.一般不需要提供client_secret,另外client_id ,單一使用者同樣需要認(rèn)證。
??? ?? 2. 隱式授權(quán)類型不支援refresh_token(或可自行實(shí)現(xiàn))機(jī)制。
??? ?? 3. 使用者第一次使用隱式授權(quán)流程對(duì)您的應(yīng)用程式進(jìn)行身份驗(yàn)證時(shí)儲(chǔ)存存取權(quán)杖!獲得訪問(wèn)令牌後,請(qǐng)勿嘗試重新進(jìn)行身份驗(yàn)證。您儲(chǔ)存的存取令牌應(yīng)該繼續(xù)有效!
??? ?????一旦取得access_token(存在於redirect_uri的fragment中,即uri中的#部分),客戶端需要自行儲(chǔ)存access_token。
??? ?? 4.比較適用於用戶端應(yīng)用程序,例如手機(jī)/桌面用戶端程式、瀏覽器外掛程式等

??? oauth2-server-php 對(duì)此授權(quán)方式的實(shí)作如下:

??? 1. 此授權(quán)方式包含於 Authorization Code Grant (是 Authorization Code Grant 方式的簡(jiǎn)化)。
???
??? 初始化OAuth2Controller 時(shí), 只需新增AuthorizationCode 類型的授權(quán)即可,如下:
????????$server->addGrantType(newstor. Code 預(yù)設(shè)不支援Implicit Grant, 需要將Server. php 第104 行的'allow_implicit' 修改為'true' 開(kāi)啟Implicit 授權(quán)。


??? 2. 取得access_token

??? http://www.yii.com/oauth2/index.php?r=oauth2/authorize&response_type=token&client_id=testclient&client_id=testcli. response_type=token (必須,固定值)
? ? ? ? ? ? ?client_id (必須)
? ? ? ? ? ? ?redirect_uri 選? ?state??? 建議
??? 注意:response_type = token 而非code, 因?yàn)殡[式授權(quán)不用取得authorization code。
??? 返回:
??? ??? 成功:
??? ??? ??? 使用者先點(diǎn)選授權(quán)按鈕。
??? ??? ??? SUCCESS! Authorization Code: www.baidu.com?#access_token=9f0c38b475e51ccd3


??? ??? ????{"error":"redirect_uri_mismatch","error_description":"The redirect URI provided is missing or does not match"," 2"}

??? access_token 存在於redirect_uri 中的片段(fragment)中, 即'#'符號(hào)之後,client 需要自己提取片段中的access_token 並注意保存。開(kāi)發(fā)人員應(yīng)注意,有些使用者代理程式不支援在HTTP「Location」HTTP回應(yīng)標(biāo)頭欄位中包含片段組成部分。這些用戶端需要使用除了3xx 重定向回應(yīng)以外的其他方法來(lái)重定向客戶端——-例如,返回一個(gè)HTML頁(yè)面,其中包含一個(gè)具有連結(jié)到重定向URI的動(dòng)作的「繼續(xù)」按鈕。
????

第三種認(rèn)證方式: Resource Owner Password Credentials (資源擁有者密碼憑證許可)

??? 資源擁有者密碼憑證許可類型適合於資源擁有者與客戶端具有作業(yè)系統(tǒng)關(guān)係的情況,例如裝置或高階系統(tǒng)關(guān)係特權(quán)應(yīng)用。當(dāng)啟用這種許可類型時(shí)授權(quán)伺服器應(yīng)該特別關(guān)照且只有當(dāng)其他流程都不可用時(shí)才可以。

??? 這種授權(quán)類型適合能夠取得資源擁有者憑證(使用者名稱和密碼,通常使用互動(dòng)的形式)的客戶端。透過(guò)轉(zhuǎn)換已儲(chǔ)存的憑證至存取權(quán)令牌,它也用於遷移現(xiàn)存的使用如HTTP基本或摘要身份驗(yàn)證的直接身份驗(yàn)證方案的用戶端至OAuth。

???? +----------+
???? | Resource |
???? |? Owner?? |
???????? v
????????? |??? Resource Owner
???????? (A) Password Credentials
????????? |
????????? v
????與 +---------+????????????? +---------------+
???? |???????? |>--(B)---- Resource Owner -- ----->|?????????????? |
???? |???????? |??????Client? |?????????????????????????????????)---- Access Token ---------???? |??????????
???? +--- ------+?????????????????????????????????步驟:

(A)資源擁有者提供給客戶端它的使用者名稱和密碼。
??? (B)透過(guò)包含從資源擁有者接收到的憑證,用戶端從授權(quán)伺服器的令牌端點(diǎn)請(qǐng)求存取令牌。當(dāng)發(fā)起請(qǐng)求時(shí),客戶端與授權(quán)伺服器進(jìn)行身份驗(yàn)證。

??? (C)授權(quán)伺服器對(duì)用戶端進(jìn)行身份驗(yàn)證,驗(yàn)證資源擁有者的憑證,如果有效,請(qǐng)頒發(fā)存取權(quán)杖。


??? Tips: 客戶端一旦取得存取令牌必須丟棄憑證。

oauth2-服務(wù)器new OAuth2GrantTypeUserCredentials($storage));

??? 2. 取得access_token :

????curl -u testclient:testpass www.yii.com/oauth2/index. '

??? 回:
??? ??? {"access_token":"66decd1b10891db5f8f63efe7?? ??? ?"token_type":"bearer",
??? ??? ?"scope":null,
??? ???

??? Tips :??? Github 上oauth2-server-php 提供的sql schema user 表裡面沒(méi)有user_id 欄位[12],需要自行加入該欄位(主鍵, auto_increment)。
??? ??? user 表設(shè)計(jì)使用 sha1 摘要方式,並未新增 salt。
??? ????
??? ??? 在Pdo.php 有:
??? ????// plaintext password?, $password)
??? ??? {
??? ??? ??? return $user['password'] == sha1($password );
??? ??? }
??? ??? 使用者認(rèn)證時(shí)需要改寫此函數(shù)。



第四種認(rèn)證方式: Client Credentials Grant (客戶端憑證許可)

??? 當(dāng)客戶端請(qǐng)求存取它所控制的,或事先與授權(quán)伺服器協(xié)商(所採(cǎi)用的方法超出了本規(guī)範(fàn)的範(fàn)圍)的其他資源擁有者的受保護(hù)資源,用戶端可以只使用它的客戶端憑證(或其他受支援的身份驗(yàn)證方法)請(qǐng)求存取權(quán)杖。

??? 用戶端憑證授權(quán)類型必須只能由機(jī)密用戶端使用。

???? +---------+??????????????????????????????????????????????????????????????卷? |???? Server??? |
???? |???????? |?????? |?????????????? |
???? +---------+???????????

???? 圖4:客戶端憑證流程

???? 在圖4中的所示流程包含以下步驟:

??? (A)用戶端與授權(quán)伺服器進(jìn)行身份驗(yàn)證並向令牌端點(diǎn)請(qǐng)求存取令牌。

??? (B)授權(quán)伺服器對(duì)用戶端進(jìn)行身份驗(yàn)證,如果有效,請(qǐng)頒發(fā)存取權(quán)杖。

???? Tips: 這是最簡(jiǎn)單的認(rèn)證方式。

???? 因客戶端身分驗(yàn)證被用作授權(quán)許可,因此不需要其他授權(quán)請(qǐng)求。

??? 實(shí)作如下:
??? 1. 在Oauth2Controller?2. 取得access_token:

????curl -u testclient: testpass www.yii.com/oauth2/index.php?r=oauth2/token -d 'grant_type=client_credentials'
????
??? 提交參數(shù): gr?? scope??? OPTIONAL.??
??? 回:
{"access_token": "f3c30def0d28c633e34921b65388eb0bbd9d5ff9",
??? ??? ?"expires_in":3600,??): ???? ?"scope":null}

??? Tips: Client 直接使用自己的client id 和client_secret 取得access_token;
??? ????? RFC67499規(guī)範(fàn)指明[10] clinet crendentials 用戶端認(rèn)證取得access_token 時(shí)不包括refresh_token。
??? ????? 不過(guò),oauth2-server-php 提供了控制開(kāi)關(guān),在 OAuth2/GrantTypes/ClientCredentials.php 第 33 行[11],
??? acc?頒發(fā) refresh_token。
????

第三部分: access_token 類型說(shuō)明
??? 用戶端在操作資料資源時(shí)(透過(guò) api)需要向 server 出示 access_token,關(guān)於如何出示 access_token 和 access_token 類型由下列部分說(shuō)明。
??? IETF rfc 6749 中所說(shuō)明的 access_token 類型有兩種:Bearer type 和 MAC type。
??? 由於 OAuth2-Server-php 對(duì)於 MAC 類型的 access_token 尚在開(kāi)發(fā)之中,以下僅針對(duì)最常使用的 Bearer 類型 access_token 進(jìn)行說(shuō)明。

??? 有三種在資源請(qǐng)求中傳送 bearer access_token 資源給資源伺服器的方法[13]??蛻舳瞬荒茉诿看握?qǐng)求中使用超過(guò)一個(gè)方法傳輸令牌。
??? a. 當(dāng)在由HTTP/1.1[RFC2617]定義的「Authorization」請(qǐng)求頭部欄位中傳送存取權(quán)杖時(shí),用戶端使用「Bearer」驗(yàn)證方案來(lái)傳送存取權(quán)杖。

??? ??? GET /resource HTTP/1.1
??? ??? Host: server.example.com
??? ??? Authorization: 5091.??? 用戶端應(yīng)該使用帶有「Bearer」HTTP授權(quán)方案的「Authorization」請(qǐng)求頭部欄位發(fā)起帶有不記名令牌的身份驗(yàn)證請(qǐng)求。資源伺服器必須支援此方法。
????
??? b. 表單編碼的主體參數(shù)
?????? 當(dāng)在HTTP請(qǐng)求實(shí)體主體傳送存取權(quán)杖時(shí),且客戶端採(cǎi)用「access_token」參數(shù)向請(qǐng)求主體中新增存取令牌。用戶端不能使用此方法,除非符合下列所有條件:
?????? HTTP請(qǐng)求的實(shí)體頭部含有設(shè)定為「application/x-www-form-urlencoded」的「Content-Type」頭部欄位。
?????? 實(shí)體主體遵循HTML4.01[W3C.REC-html401-19991224]定義的「application/x-www-form-urlencoded」內(nèi)容類型的編碼要求。
?????? HTTP請(qǐng)求實(shí)體主體是單一的部分。
?????? 在實(shí)體主體中編碼的內(nèi)容必須完全由ASCII[USASCII]字元組成。
?????? HTTP請(qǐng)求方法是請(qǐng)求主體定義為其定義的語(yǔ)法。尤其是,這意味著“GET”方法不能被使用。
???????
?????? 客戶使用傳輸層安全發(fā)動(dòng)如下的HTTP請(qǐng)求:
??? ????
??.com
??? ??? Content-Type: application/x-www-form-urlencoded
??? ??? access_token=mF_9.B5f -4.1JqM

??? c. 當(dāng)在HTTP請(qǐng)求URI中發(fā)送存取權(quán)杖時(shí),用戶端採(cǎi)用「access_token」參數(shù),向「統(tǒng)一資源標(biāo)示符(URI):通用語(yǔ)法」RFC3986定義的請(qǐng)求URI查詢部分新增存取命令牌。

?????? 例如,客戶端採(cǎi)用傳輸層安全啟動(dòng)如下的HTTP請(qǐng)求:

??? ??? GET /resource?access_token=mF_9.B5f-4.1JJJJJM未來(lái)化
?????? 它不應(yīng)該被使用,除非不能在「Authorization」請(qǐng)求頭部欄位或HTTP請(qǐng)求實(shí)體主體中傳送存取權(quán)杖。
????
??? 以上在 rfc6750 規(guī)格所提出的三種 access_token 的使用方式。推薦使用第一種方案。 Bearer token 的使用需要藉助 TLS 來(lái)確保 access_token 傳輸時(shí)的安全性。


第四部分: 使用Bearer access_token 的呼叫api

??? 1. 使用refresh_token testaccess_token:
?????curl -u testcliclient:testpass/ynii.com =refresh_token&refresh_token=1ce1a52dff3b5ab836ae25714c714cb86bf31b6f"

??? 返回:?
???25f64da18f1",
??? ??? ?"expires_in":3600,
??? ??? ?"token_type":?這裡沒(méi)有新的refresh_token,需要進(jìn)行設(shè)定以重新取得refresh_token,可修改OAuth2/GrantType/RefreshToken.php 中的RefreshToken class __construct 方法中的'always_issue_new_refresh_token' => true 來(lái)開(kāi)啟頒發(fā)新的refresh_token。
??? Tips: IETF rfc2649 中關(guān)於refresh_token section 的部分說(shuō)明,
??? ????POST /token HTTP/1.1???czZCaGRSa3F0MzpnWDFmQmF0M2JW
??? ??? Content-Type: application/x-www-form-urlencoded

?????=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA

??? 需要提供客戶端的client_id 和client_secret, grant_type 值必須是refresh_token。
??? access_token 有效期限內(nèi)不能使用 refresh_token 換取新的 access_token。

??? 2. 使用 access_token:
??? a. client app 使用 access_token 取得 resource 資訊。
??? oauth2-server 驗(yàn)證 access_token:
??? ????curl www.yii.com/oauth2/index.php?r=oauth2/verifytoken -d 'access_token=aea4a105953194670747000cc
??? 回:
??? ????{"result":"success",
"message":"your access token is valid."
??? ??? }??? 此部分只是為了驗(yàn)證access token 的有效性,client app 並不應(yīng)該直接調(diào)用該方法,而是在請(qǐng)求資源時(shí)有server不同處理。
??? 可以在 Oauth2 extension 的 Server.php 中來(lái)修改 access_token 的有效期限。

??? 3. scope
??? scope 需要服務(wù)端確定特定的可行操作。
??? scope 用來(lái)決定 client 所能進(jìn)行的操作權(quán)限。專案中操作權(quán)限由 srbac 控制, Oauth2 中暫不做處理。

??? 4. state
??? state 為 client app 在第一步驟中取得 authorization code 時(shí)傳遞並由 OAuth2 Server 傳回的隨機(jī)雜湊參數(shù)。 state 參數(shù)主要用來(lái)防止跨站點(diǎn)請(qǐng)求偽造(Cross Site Request Forgery, CSRF),相關(guān)討論可參考本文最後的參考【7】和【8】。

????
References:

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)