OAuth2.0說明文檔
1、OAuth 2.0 簡介
OAuth為應用提供了一種訪問受保護資源的方法。在應用訪問受保護資源之前,它必須先從資源擁有者處獲取授權(訪問許可),然后用訪問許可交換訪問令牌(代表許可的作用域、持續時間和其它屬性)。應用通過向資源服務器出示訪問令牌來訪問受保護資源。
下圖中的名詞說明
Resource Owner:用戶
User-Agent:瀏覽器
Client:應用服務器
Authorization Server:認證服務器(用戶信息存放服務的認證服務器)
Resource Server:資源服務器(用戶真正信息存放的服務器,需要通過access_token進行訪問)
Web-Hosted Client Resource:web托管的客戶端資源(這個確切的說,我也不知道叫啥才適合)
OAuth2.0服務支持以下5種獲取Access Token的方式:(圖片來源:OAuth2.0協議草案 )
1.1、APP密鑰模式(Client Credentials Flow)
直接使用app密鑰,不另作說明
1.2、Resource Owner Password Credentials Flow
直接使用用戶密碼,不另作說明
1.3、Authorization Code Flow
授權碼模式
流程簡單表述為,當用戶訪問應用服務器
(A)應用服務器返回帶有授權信息的重定向鏈接,瀏覽器拿到鏈接,轉為訪問認證服務器(見下面:獲取Authorization Code)
(B)認證服務器提供界面給用戶進行確認授權,用戶確認授權
(C)用戶確認授權后,認證服務器返回帶有code的重定向鏈接,瀏覽器拿到鏈接,轉為訪問應用服務器
(D)應用服務器拿到code,訪問認證服務器(見下面:通過Authorization Code獲取Access Token)
(E)認證服務器驗證后,返回access_token給應用服務器
授權碼是應用彈出窗口,並將用戶引導到授權服務器,傳入標識符、請求作用域、本地狀態,和一個重定向URI。授權服務器驗證用戶,獲得授權,然后用重定向URI引導回應用,並傳回授權碼給應用。因為終端用戶只在授權服務器上進行驗證,所以終端用戶的用戶名和密碼從來不用分享給應用。
獲取Authorization Code
參數名 |
必選 |
介紹 |
client_id |
True |
創建應用時獲得的App Key |
response_type |
True |
此值固定為“code” |
redirect_uri |
True |
授權后要回調的URI,即接收Authorization Code的URI, 其值可以是“oob”。 非“oob”值的redirect_uri所在域名必須與開發者注冊應用時所提供的回調地址的域名相匹配 |
scope |
False |
以空格分隔的權限列表,若不傳遞此參數,代表請求默認的basic權限。(目前只有basic權限) |
state |
False |
hash,用於預防CSRF,用於保持請求和回調的狀態,授權服務器在重定向到“redirect_uri”時,會在Query Parameter中原樣回傳該參數 |
/authorize?client_id=ABCDEFGHIJKLMNOP&response_type=code&redirect_uri=http://www.example.com/oauth_redirect&scope=basic&state=mytest
如果用戶在此頁面同意授權,則將重定向用戶瀏覽器到指定的“redirect_uri”,並附帶上表示授權服務所分配的Authorization Code的code參數(假設為“0987654321“),以及state參數(如果有),驗證通過后,認證服務器將重定向用戶瀏覽器到“http://www.example.com/oauth_redirect?state=mytest&code=0987654321”
說明:每一個Authorization Code的有效期為60秒(可根據需求調長一些,但原則上應盡可能短),並且只能使用一次,再次使用將無效。
通過Authorization Code獲取Access Token
通過上面第一步獲得Authorization Code后,便可以用其向認證服務器換取一個Access Token。
參數名 |
必選 |
介紹 |
grant_type |
True |
此值固定為“authorization_code” |
code |
True |
通過上面第一步所獲得的Authorization Code |
client_id |
True |
創建應用時獲得的App Key |
client_secret |
True |
應用的App Secret |
redirect_uri |
True |
redirect_uri所在域名必須與開發者注冊應用時所提供的回調地址的域名匹配 |
/access_token?grant_type=authorization_code&code=0987654321&client_id=ABCDEFGHIJKLMNOP&client_secret=abcdefg...&redirect_uri=http://www.example.com/oauth_redirect
若參數無誤,服務器將返回一段JSON文本,包含以下參數:
參數名 |
必選 |
介紹 |
access_token |
True |
獲取的Access Token |
token_type |
False |
令牌類型“bearer”或“mac”,暫無很明確的說明,通常是brearer或省略 |
expires_in |
True |
Access Token的有效期,以秒為單位 |
refresh_token |
False |
用於刷新Access Token 的 Refresh Token |
scope |
False |
Access Token最終的訪問范圍,即用戶實際授予的權限列表,用戶在授權頁面時,有可能會取消掉某些請求的權限,通常只作或只有登錄認證的話,可忽略 |
示例:Content-Type: application/json
{"access_token":"uuvvwwxxyyzz","expires_in":"3600", "scope":"basic","refresh_token":"qwertyuiop"}
1.4、Implicit Grant Flow
簡化模式,該模式下,通常client和user-agent是在一起的,如手機app等
流程簡單表述為,當用戶訪問應用服務
(A)應用服務返回帶有授權信息的重定向鏈接,瀏覽器拿到鏈接,轉為訪問認證服務器
(B)認證服務器提供界面給用戶進行確認授權,用戶確認授權
(C)假設資源所有者授予訪問權限,則認證服務器返回帶有獲取access_token的令牌的鏈接
(D)瀏覽器鏈接重定向到一個web客戶端資源,訪問資源服務器
(E)返回一個網頁(通常是一個嵌入式腳本的HTML文檔)
(F)瀏覽器從腳本中提取access_token(包括其他參數)
(G)瀏覽器帶着access_token重定向到應用服務器,應用服務器到瀏覽器傳來的access_token
采用Implicit Grant方式獲取Access Token的授權驗證流程又被稱為User-Agent Flow,適用於所有無Server端配合的應用(由於應用往往位於一個User Agent里,如瀏覽器里面,因此這類應用在某些平台下又被稱為Client-Side Application),如手機/桌面客戶端程序、瀏覽器插件等,以及基於JavaScript等腳本語言實現的應用。
1.5、Refreshing an Expired Access Token
令牌刷新方式,適用於所有有Server端配合的應用,其實就是更新access_token
獲取Access Token,都會拿到有效期為14天的Refresh Token,和2分鍾有效期的Access Token。對於這些應用,只要用戶在14天內登錄,應用就可以使用Refresh Token獲得新的Access Token。
要使用Refresh Token獲得新的Access Token,需要應用在其服務端發送請求(推薦用POST方法)到開放平台OAuth2.0授權服務的以下地址: “/access_token”,並帶上以下參數:
參數名 |
必選 |
介紹 |
grant_type |
True |
必須為“refresh_token” |
refresh_token |
True |
用於刷新Access Token用的Refresh Token |
client_id |
True |
創建應用時獲得的App Key |
client_secret |
True |
應用的App Secret |
scope |
False |
以空格分隔的權限列表,若不傳遞此參數,代表請求默認的basic權限。注:通過Refresh Token刷新Access Token時所要求的scope權限范圍必須小於等於上次獲取Access Token時授予的權限范圍 |
示例:
/access_token?grant_type=refresh_token&refresh_token=qwertyuiop&client_id=ABCDEFGHIJKLMNOP&client_secret=abcdefg...&scope=basic
若請求成功服務器將返回一段JSON文本,包含以下參數
示例:Content-Type: application/json
{ "access_token":"uuvvwwxxyyzz","expires_in":"120","scope":"basic","refresh_token":" qwertyuiop"}
2、使用access_token調用API
獲取access_token以后,就可以使用access_token調用API接口。
調用API的URL“/json”傳遞需要的參數,參數的詳細介紹請參照以上描述
例:/json?access_token=uuvvwwxxyyzz