簡介
oauth2.0是一種目前被廣泛使用的開放式授權協議。各個服務平台可以使用oauth2.0協議來允許平台用戶授權第三方來獲取用戶的信息數據等。
術語
Client : 第三方應用
Resource Owner : 資源擁有者,即平台用戶
Authorization Server : 認證服務器,即平台提供的專門處理認證的服務
Resource Server : 資源服務器,平台給第三方提供資源訪問的服務器,它與認證服務器可以是同一台也可以不是同一台
User Agent : 用戶代理,即瀏覽器
協議流程

(A)用戶打開客戶端以后,客戶端要求用戶給予授權
(B)用戶同意給予客戶端授權。
(C)客戶端使用上一步獲得的授權,向認證服務器申請令牌。
(D)認證服務器對客戶端進行認證以后,確認無誤,同意發放令牌。
(E)客戶端使用令牌,向資源服務器申請獲取資源。
(F)資源服務器確認令牌無誤,同意向客戶端開放資源。
客戶端授權類型
- 授權碼模式(authorization code)
- 簡化模式(implict)
- 密碼模式(resource owner password credentials)
- 客戶端模式(client credentials)
目前最常用的是授權碼模式,因此也只對授權碼模式進行學習。
授權碼模式流程

(A)用戶訪問客戶端,后者將前者重定向到認證服務器。
(B)用戶選擇是否給予客戶端授權。
(C)假設用戶給予授權,認證服務器將用戶導向客戶端事先指定的"重定向
URI"(redirection URI),同時附上一個授權碼。
(D)客戶端收到授權碼,附上早先的"重定向URI",向認證服務器申請令牌。這一
步是在客戶端的后台的服務器上完成的,對用戶不可見。
(E)認證服務器核對了授權碼和重定向URI,確認無誤后,向客戶端發送訪問令牌
(access token)和更新令牌(refresh token)。
獲取授權碼(authorization code)
請求參數:
參數名稱 | 是否可選 | 參數值 | 說明 |
response_type
|
必填 | code | 響應類型,此處固定值 |
client_id
|
必填 | 客戶端標識 | |
redirect_uri
|
必填 | 重定向url | |
scope
|
可選 | 權限申請范圍,多個空格分隔 | |
state
|
可選 | 客戶端狀態,服務端原樣返回 |
例如:
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com
Host: server.example.com
返回參數:
參數名稱 | 是否可選 | 參數值 | 說明 |
code
|
必填 | 授權碼,有效時間很短,一次性 | |
state
|
可選 | 如果請求中包含,則原樣返回 |
例如:
HTTP/1.1302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz
錯誤響應(JSON):
參數名稱 | 是否可選 | 參數值 | 說明 |
error
|
必填 | 參見“錯誤代碼表” | 錯誤代碼 |
error_description
|
可選 | 錯誤描述 | |
error_uri
|
可選 | 錯誤信息查看手冊url |
錯誤代碼表:
錯誤碼 | 說明 |
invalid_request
|
請求格式不正確(參數缺失,重復等) |
unauthorized_client
|
客戶端未授權 |
access_denied
|
授權被拒絕 |
unsupported_response_type
|
response_type參數指定值不支持 |
invalid_scope
|
scope參數有誤 |
server_error
|
授權服務器內部錯誤 |
temporarily_unavailable
|
授權服務暫時無法訪問 |
例如:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?error=access_denied&state=xyz
Location: https://client.example.com/cb?error=access_denied&state=xyz
注:當請求沒有處理成功(參數正確,獲取到授權碼)時,返回錯誤信息時應將http響應的響應碼也更改為對應的含義(500除外,可以使用其他代替)。僅當處理成功時http響應碼才應該被設置為200.
獲取訪問令牌(access token)
請求參數:
參數名稱 | 是否可選 | 參數值 | 說明 |
grant_type
|
必填 |
authorization_code
|
固定值 |
code
|
必填 | 授權碼 | |
redirect_uri
|
可選 | 如有,必須和上一步一致 | |
client_id
|
必填 | 客戶端標識 | |
client_secret | 必填 | 客戶端秘鑰(該字段平台定義) |
例如:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
返回參數(JSON):
參數名稱 | 是否可選 | 參數值 | 說明 |
access_token | 必填 | bearer | 訪問令牌 |
token_type | 必填 | 令牌類型,bearer或mac | |
expires_in | 可選 | 過期時間 | |
refresh_token | 可選 | 刷新令牌 | |
scope | 可選 | 權限范圍 |
例如:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}
錯誤響應(JSON):
參數名稱 | 是否可選 | 參數值 | 說明 |
error | 必填 | 參見“錯誤代碼表” | 錯誤代碼 |
error_description | 可選 | 錯誤描述 | |
error_uri | 可選 | 錯誤信息查看手冊url |
錯誤代碼表:
錯誤碼 | 說明 |
invalid_request | 請求格式不正確(參數缺失,重復等) |
invalid_client
|
客戶端權限校驗失敗 |
invalid_grant
|
授權碼或refresh token無效 |
unauthorized_client
|
客戶端未被授權使用該授權類型 |
unsupported_grant_type
|
授權服務器不支持該授權類型 |
invalid_scope
|
scope參數有誤 |
例如:
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"error":"invalid_request"
}
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"error":"invalid_request"
}
注:當請求沒有處理成功(參數正確,獲取到授權碼)時,返回錯誤信息時應將http響應的響應碼也更改為對應的含義(500除外,可以使用其他代替)。僅當處理成功時http響應碼才應該被設置為200.
HTTP響應碼參考:
302 Found
400 Bad Request
401 Unauthorized
403 Forbidden
503 Service Unavailable
400 Bad Request
401 Unauthorized
403 Forbidden
503 Service Unavailable
刷新訪問令牌
請求參數:
參數名稱 | 是否可選 | 參數值 | 說明 |
grant_type | 必填 |
refresh_token
|
固定值 |
refresh_token | 必填 | 刷新令牌 | |
client_id | 必填 | 客戶端標識 | |
client_secret | 必填 | 客戶端秘鑰 | |
scop | 可選 | 權限范圍 |
注:授權信息可以通過http請求頭的形式發送。
例如:
POST /token HTTP/
1.
1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content- Type: application/x-www- form-urlencoded
grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content- Type: application/x-www- form-urlencoded
grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
返回參數和錯誤響應與“獲取訪問令牌”一致。
訪問保護資源
客戶端訪問用戶受保護資源時,一般只需要訪問平台給出的url地址,然后將access_token和其他參數一起發送過去即可。令牌信息可以通過請求頭或者包含在請求數據中。