關於OAuth2 php
OAuth2.0是OAuth協議的下一版本,但不向後兼容OAuth 1.0即徹底廢止了OAuth1.0。 OAuth 2.0關注客戶端開發者的簡易性。要麼經過組織在資源擁有者和HTTP服務商之間的被批准的交互動做表明用戶,要麼容許第三方應用表明用戶得到訪問的權 限。同時爲Web應用,桌面應用和手機,和起居室設備提供專門的認證流程。git
關於受權模式github
開發者可經過網頁受權接口調用憑證,access_token來登錄獲取用戶基本信息.OAuth2受權模式(Grant Type)有
Authorization Code,User Credentials,Refresh Token,Implicit,Client Credentials,JWT Bearer。目前測試了Authorization Code,User Credentials兩種模式,其餘的後續會有些補充。api
(1)配置文件 config/production/oauth2lifetime.php 爲了安全設計,access_token時間值有效期較短,可用 refresh_token 刷新access_token 配置文件 config/production/oauth2lifetime.php的配置項以下return array( 'refresh_token_lifetime' => 315360000, //配置受權的refresh token的有效刷新時間,若是註釋此項,默認1209600秒(14天) 'access_lifetime' => 86400 //配置受權容許訪問的生命週期時間,若是註釋此項,默認3600秒(1小時)); (2)新增 refresh_token 受權類型(refresh_token類型,依附於authorization_code或password,不可獨立存在),必須插入容許的refresh_token受權類型的客戶端信息 INSERT INTO sys_oauth_clients (client_id, client_secret, redirect_uri, grant_types, scope) VALUES ("wx62fdabd2c88c5214", "832daaf5e66551116b958eb12fe15c8c", "http://www.icome.com", "refresh_token", "snsapi_userinfo");
受權碼授予類型用於得到訪問權限令牌和刷新令牌,併爲機密客戶進行了優化。由於這是一個基於重定向的流程,客戶端必須可以
與資源全部者的用戶代理(一般是一個網絡瀏覽器)和可以接收來的請求(經過重定向)從受權服務器。瀏覽器
Note:Authorization Code 模式的序列圖安全
例如 :(服務端:http://www.eric.aysaas.com 客戶端:http://www.icome.com )服務器
參數說明測試
參數 | 是否必須 | 說明 |
---|---|---|
client_id | 是 | 鏈接服務端的客戶端在服務端上的惟一標識 |
redirect_uri | 是 | 受權後重定向的回調連接地址 |
response_type | 是 | 返回類型,請填寫code |
grant_type | 是 | 返回類型,請填寫authorization_code |
scope | 是 | 應用受權做用域,請填寫snsapi_userinfo (彈出受權頁面,可經過access_token拿到暱稱、性別、只要用戶受權,就能獲取其信息) |
state | 否 | 重定向後會帶上state參數,開發者能夠填寫a-zA-Z0-9的參數值,最多128字節 |
下圖爲scope等於snsapi_userinfo時的受權頁面:優化
若是用戶贊成受權,頁面將跳轉至 redirect_uri/?code=CODE&state=STATE。若用戶禁止受權,則重定向後不會帶上code參數,僅會帶上state參數redirect_uri?state=STATE
code說明 :
code做爲換取access_token的票據,每次用戶受權帶上的code將不同,code只能使用一次,30秒未被使用自動過時。
Note :爲了安全性,https跳轉到http時,http頭無 http_referer 參數.
http://www.eric.aysaas.com/api2/oauth2/token
參數說明
參數 | 是否必須 | 說明 |
---|---|---|
client_id | 是 | 鏈接服務端的客戶端在服務端上的惟一標識 |
client_secret | 是 | 鏈接服務端的客戶端在服務端上的惟一標識對應的密碼 |
code | 是 | 填寫第一步獲取的code參數 |
grant_type | 是 | 填寫爲authorization_code |
Note: 請快速操做, 由於 Authorization Codes 30 秒內有效!
返回說明
正確時返回的JSON數據包以下:
{
"access_token":"a669981340c84d6112e4800ff50afd7daf3590b7",
"expires_in":"3600",
"token_type":"Bearer",
"scope":"snsapi_userinfo",
"refresh_token":"0c3ac3a064359ae8a5a031a196236b72641ec545",
}
因爲access_token擁有較短的有效期,當access_token超時後,可使用refresh_token進行刷新,
refresh_token擁有較長的有效期(系統默認14天,可由配置文件修改),爲了安全,當refresh_token失效的後,須要用戶從新受權。
請求方法
獲取第二步的refresh_token後,請求如下連接獲取access_token:
http://www.eric.aysaas.com/api2/oauth2/token
參數說明
參數 | 是否必須 | 說明 |
---|---|---|
client_id | 是 | 鏈接服務端的客戶端在服務端上的惟一標識 |
client_secret | 是 | 鏈接服務端的客戶端在服務端上的惟一標識對應的密碼 |
grant_type | 是 | 填寫 refresh_token |
refresh_token | 是 | 獲取第二步的refresh_token |
返回說明
正確時返回的JSON數據包以下:
{
"access_token":"cff6652829efd9551b2526b0f82cbf21e1e9e11c",
"expires_in":"3600",
"token_type":"Bearer",
"open_id":"d3g2MmZkMjEyMzJmMjk3YTU3YTVh",
"scope":"snsapi_userinfo",
}
http://www.eric.aysaas.com/api2/oauth2/resource
參數說明
參數 | 是否必須 | 說明 |
---|---|---|
access_token | 是 | 網頁受權接口調用憑證,access_token |
Note: access_token, 有效期3600秒!
返回說明
正確時返回的JSON數據包以下:
{
"status":200,
"result":
{
"id":"2",
"user_id":"admin",
"real_name":"管理員",
"avatar":"http:\/\/fileio.eric.aysaas.com\/api\/user\/avatar\/show\/120\/120\/admin",
"sex":"0",
"create_time":"0000-00-00 00:00:00"
}
}
資源擁有者密碼憑據授予類型是合適的資源擁有者與之信任關係的案例客戶端,如設備操做系統或具備很強的特權應 用。受權服務器應採起特殊照顧啓用此批批類型,只有當其餘流不可行的。此批批類型是適合客戶得到的資源全部者的憑據(用戶名和密碼,一般使用互動式的形 式。它也用來遷移現有的客戶使用直接的認證方案,如HTTP基本或摘要經過將存儲的憑據的OAuth認證訪問令牌。
Note:User Credentials模式序列圖
http://www.eric.aysaas.com/api2/oauth2/token
參數說明
參數 | 是否必須 | 說明 |
---|---|---|
client_id | 是 | 鏈接服務端的客戶端在服務端上的惟一標識 |
client_secret | 是 | 鏈接服務端的客戶端在服務端上的惟一標識對應的密碼 |
grant_type | 是 | 填寫爲password |
username | 是 | 用戶在服務端上的用戶名 |
password | 是 | 用戶在服務端上的密碼 |
返回說明
正確時返回的JSON數據包以下:
{
"access_token":"805f21204330018e1168a6984acab7b2f5e3ab82",
"expires_in":"3600",
"token_type":"Bearer",
"scope":"null",
"refresh_token":"bf75b37b527ef92be4a2e289223f85ba6bc9adbb",
}
而後同Authorization Code第三步,用受權接口調用憑證 access_token 拉取用戶信息.