使用 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:

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

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

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

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

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

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

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