豆瓣支持OAuth2.0協(xié)議的授權(quán)訪問。關(guān)于OAuth2.0協(xié)議規(guī)范,請(qǐng)參考這里。
使用OAuth2.0的流程可以簡單概括為:
豆瓣支持三種OAuth2.0的授權(quán)流程:
這兩種授權(quán)流程基本相同,需要通過兩步來獲取access_token。
通過在瀏覽器中訪問下面的地址,來引導(dǎo)用戶授權(quán),并獲得authorization_code
https://www.douban.com/service/auth2/auth
參數(shù):
參數(shù)名稱 | 參數(shù)說明 |
client_id | 必選參數(shù),應(yīng)用的唯一標(biāo)識(shí),對(duì)應(yīng)于APIKey |
redirect_uri | 必選參數(shù),用戶授權(quán)完成后的回調(diào)地址,應(yīng)用需要通過此回調(diào)地址獲得用戶的授權(quán)結(jié)果。此地址必須與在應(yīng)用注冊(cè)時(shí)填寫的回調(diào)地址一致。 |
response_type | 必選參數(shù),此值可以為 code 或者 token 。在本流程中,此值為 code |
scope | 可選參數(shù),申請(qǐng)權(quán)限的范圍,如果不填,則使用缺省的scope。如果申請(qǐng)多個(gè)scope,使用逗號(hào)分隔。 |
state | 可選參數(shù),用來維護(hù)請(qǐng)求和回調(diào)狀態(tài)的附加字符串,在授權(quán)完成回調(diào)時(shí)會(huì)附加此參數(shù),應(yīng)用可以根據(jù)此字符串來判斷上下文關(guān)系。 |
注意:此請(qǐng)求必須是HTTP GET方式
例如:
https://www.douban.com/service/auth2/auth? client_id=0b5405e19c58e4cc21fc11a4d50aae64& redirect_uri=https://www.example.com/back& response_type=code& scope=shuo_basic_r,shuo_basic_w,douban_basic_common
返回結(jié)果:
當(dāng)用戶拒絕授權(quán)時(shí),瀏覽器會(huì)重定向到redirect_uri,并附加錯(cuò)誤信息
https://www.example.com/back?error=access_denied
當(dāng)用戶同意授權(quán)時(shí),瀏覽器會(huì)重定向到redirect_uri,并附加autorization_code
https://www.example.com/back?code=9b73a4248
https://www.douban.com/service/auth2/token
參數(shù)名稱 | 參數(shù)說明 |
client_id | 必選參數(shù),應(yīng)用的唯一標(biāo)識(shí),對(duì)應(yīng)于APIKey |
client_secret | 必選參數(shù),應(yīng)用的唯一標(biāo)識(shí),對(duì)應(yīng)于豆瓣secret |
redirect_uri | 必選參數(shù),用戶授權(quán)完成后的回調(diào)地址,應(yīng)用需要通過此回調(diào)地址獲得用戶的授權(quán)結(jié)果。此地址必須與在應(yīng)用注冊(cè)時(shí)填寫的回調(diào)地址一致 |
grant_type | 必選參數(shù),此值可以為 authorization_code 或者 refresh_token 。在本流程中,此值為 authorization_code |
code | 必選參數(shù),上一步中獲得的authorization_code |
注意:此請(qǐng)求必須是HTTP POST方式
例如:
https://www.douban.com/service/auth2/token? client_id=0b5405e19c58e4cc21fc11a4d50aae64& client_secret=edfc4e395ef93375& redirect_uri=https://www.example.com/back& grant_type=authorization_code& code=9b73a4248
返回結(jié)果:
{ "access_token":"a14afef0f66fcffce3e0fcd2e34f6ff4", "expires_in":3920, "refresh_token":"5d633d136b6d56a41829b73a424803ec", "douban_user_id":"1221"}
curl "https://api.douban.com/v2/user/~me" -H "Authorization: Bearer a14afef0f66fcffce3e0fcd2e34f6ff4"
在OAuth2.0中,access_token不再長期有效。在授權(quán)獲取access_token時(shí)會(huì)一并返回其有效期,也就是返回值中的expires_in參數(shù)。
在access_token使用過程中,如果服務(wù)器返回106錯(cuò)誤:“access_token_has_expired ”,此時(shí),說明access_token已經(jīng)過期,除了通過再次引導(dǎo)用戶進(jìn)行授權(quán)來獲取access_token外,還可以通過refresh_token的方式來換取新的access_token和refresh_token。
通過refresh_token換取access_token的處理過程如下:
https://www.douban.com/service/auth2/token
參數(shù)名稱 | 參數(shù)說明 |
client_id | 必選參數(shù),應(yīng)用的唯一標(biāo)識(shí),對(duì)應(yīng)于APIKey |
client_secret | 必選參數(shù),應(yīng)用的唯一標(biāo)識(shí),對(duì)應(yīng)于豆瓣secret |
redirect_uri | 必選參數(shù),用戶授權(quán)完成后的回調(diào)地址,應(yīng)用需要通過此回調(diào)地址獲得用戶的授權(quán)結(jié)果。此地址必須與在應(yīng)用注冊(cè)時(shí)填寫的回調(diào)地址一致 |
grant_type | 必選參數(shù),此值可以為 authorization_code 或者 refresh_token。在本流程中,此值為 refresh_token |
refresh_token | 必選參數(shù),刷新令牌 |
注意:此請(qǐng)求必須是HTTP POST方式,refresh_token只有在access_token過期時(shí)才能使用,并且只能使用一次。當(dāng)換取到的access_token再次過期時(shí),使用新的refresh_token來換取access_token
例如:
https://www.douban.com/service/auth2/token? client_id=0b5405e19c58e4cc21fc11a4d50aae64& client_secret=edfc4e395ef93375& redirect_uri=https://www.example.com/back& grant_type=refresh_token& refresh_token=5d633d136b6d56a41829b73a424803ec
返回結(jié)果:
{ "access_token":"0e63c03dfb66c4172b2b40b9f2344c45", "expires_in":3920, "refresh_token":"84406d40cc58e0ae8cc147c2650aa20a", "douban_user_id":"1000"}
級(jí)別 | access_token有效期 | refresh_token有效期 | 說明 |
L1 | 7天 | 14天 | |
L2 | 30天 | 60天 | |
L3 | 90天 | 180天 |
在用戶、應(yīng)用、服務(wù)器IP、scope等維度對(duì)接口的訪問速度進(jìn)行限制。
針對(duì)服務(wù)器IP:
級(jí)別 | 限制 |
L1 | 5000次/小時(shí) |
L2 | 10000次/小時(shí) |
L3 | 20000次/小時(shí) |
針對(duì)單用戶每應(yīng)用每scope:
級(jí)別 | 限制 |
L1 | 500次/小時(shí) |
L2 | 1000次/小時(shí) |
L3 | 2000次/小時(shí) |
返回結(jié)果的header里會(huì)有當(dāng)前訪問限制信息:
Header名稱 | 含義 |
X-Ratelimit-Limit | 單用戶每小時(shí)次數(shù) |
X-RateLimit-Remaining | 單用戶每小時(shí)剩余次數(shù) |
X-Ratelimit-Limit2 | 單ip每小時(shí)次數(shù) |
X-RateLimit-Remaining2 | 單ip每小時(shí)剩余次數(shù) |
如果在API使用過程中,有錯(cuò)誤,則返回結(jié)果為:
{ "code":113, "msg":"required_parameter_is_missing: client_id", "request":"GET /shuo/statuses/232323"}
錯(cuò)誤代碼 | 錯(cuò)誤說明 |
100 | invalid_request_scheme 錯(cuò)誤的請(qǐng)求協(xié)議 |
101 | invalid_request_method 錯(cuò)誤的請(qǐng)求方法 |
102 | access_token_is_missing 未找到access_token |
103 | invalid_access_token access_token不存在或已被用戶刪除,或者用戶修改了密碼 |
104 | invalid_apikey apikey不存在或已刪除 |
105 | apikey_is_blocked apikey已被禁用 |
106 | access_token_has_expired access_token已過期 |
107 | invalid_request_uri 請(qǐng)求地址未注冊(cè) |
108 | invalid_credencial1 用戶未授權(quán)訪問此數(shù)據(jù) |
109 | invalid_credencial2 apikey未申請(qǐng)此權(quán)限 |
110 | not_trial_user 未注冊(cè)的測(cè)試用戶 |
111 | rate_limit_exceeded1 用戶訪問速度限制 |
112 | rate_limit_exceeded2 IP訪問速度限制 |
113 | required_parameter_is_missing 缺少參數(shù) |
114 | unsupported_grant_type 錯(cuò)誤的grant_type |
115 | unsupported_response_type 錯(cuò)誤的response_type |
116 | client_secret_mismatch client_secret不匹配 |
117 | redirect_uri_mismatch redirect_uri不匹配 |
118 | invalid_authorization_code authorization_code不存在或已過期 |
119 | invalid_refresh_token refresh_token不存在或已過期 |
120 | username_password_mismatch 用戶名密碼不匹配 |
121 | invalid_user 用戶不存在或已刪除 |
122 | user_has_blocked 用戶已被屏蔽 |
123 | access_token_has_expired_since_password_changed 因用戶修改密碼而導(dǎo)致access_token過期 |
124 | access_token_has_not_expired access_token未過期 |
125 | invalid_request_scope 訪問的scope不合法,開發(fā)者不用太關(guān)注,一般不會(huì)出現(xiàn)該錯(cuò)誤 |
999 | unknown 未知錯(cuò)誤 |
HTTP狀態(tài)碼 | 說明 |
200 | 表明api的請(qǐng)求正常 |
400 | 表明api的請(qǐng)求出錯(cuò),具體原因參考上面列出的錯(cuò)誤碼 |
聯(lián)系客服