目前,百度OAuth2.0支持五種獲取Access Token的流程和一種刷新獲取AccessToken方式,第三方可根據需求選取合適的方式:javascript
百度受權的Access Token是有有效期的,這樣會影響用戶的體驗和增長開發者的工做。因此平臺提供了一種方式能夠保證受權有效期爲永久。php
獲取途徑 | 受權流程 | 介紹 | 有效期 |
---|---|---|---|
新獲取 | Authorization Code | 又稱Web Server Flow,適用於全部有Server端配合的應用。 | 有效期一個月的Access Token+有效期十年的Refresh Token。 |
Implicit Grant | 又稱User-Agent Flow,適用於全部無Server端配合的應用(桌面客戶端須要內嵌瀏覽器)。 | 有效期一個月的Access Token。 | |
Client Credentials | 即採用應用公鑰、密鑰獲取Access Token,適用於任何帶server類型應用。 經過此受權方式獲取Access Token僅可訪問平臺受權類的接口。 | 有效期一個月的Access Token+有效期十年的Refresh Token。 | |
Device | 適用於一些輸入受限的設備上(如只有數碼液晶顯示屏的打印機、電視機等)。 | 有效期一個月的Access Token+有效期十年的Refresh Token。 | |
刷新 | Refresh Token | Access Token刷新方式,適用於全部有Server端配合的應用 。 | 十年刷新期限。 |
請求用戶受權時百度提供了一個在OAuth2.0協議中沒有提到的參數:display。它是用來標識不一樣形式的客戶端所對應的不一樣展示形式的受權頁面,其值定義以下:java
|
爲確保驗證受權過程的安全,開發者必須在開發者中心預先註冊應用所在的域名或URL,用以OAuth2.0檢驗受權請求中的「redirect_uri」參數。以便保證OAuth2.0在回調過程當中,會回調到安全域名。web
開發者在開發者中心的安全設置中填寫了受權回調地址(支持至多十個受權回調地址)。數據庫
平臺提供了一種默認的redirect uri參數爲 "oob",回調後會返回一個平臺提供默認回調地址(http://openapi.baidu.com/oauth/2.0/login_success )。json
用戶受權相關的權限 | 描述 |
---|---|
basic | 用戶基本權限,能夠獲取用戶的基本信息 |
super_msg | 往用戶的百度首頁上發送消息提醒,相關API任何應用都能使用,但要想將消息提醒在百度首頁顯示,須要第三方在註冊應用時額外填寫相關信息 |
netdisk | 獲取用戶在我的雲存儲中存放的數據 |
平臺受權相關的權限 | 描述 |
public | 能夠訪問公共的Open API |
hao123 | 能夠訪問Hao123 提供的Open API接口 |
每個Access Token表明「一個用戶」或「百度開放平臺」授予「一個應用」的「一系列數據訪問操做權限」。這「一系列數據訪問操做權限」中包含默認訪問權限,以及在獲取Access Token過程當中傳遞的「scope」參數所表示的擴展權限。在調用API時,百度Open API服務會檢驗請求中的Access Token或Session Key是否包含本API須要的權限。後端
應用在請求獲取Access Token時所傳遞的「scope」參數中能夠不包含basic權限(即默認權限),一旦用戶或平臺贊成受權,則basic權限會自動授予。百度目前開放的Open API還爲數很少,目前惟必定義的擴展權限就super_msg訪問權限,應用須要這個權限時須要在獲取Access Token時指定scope=super_msg,如:api
https://openapi.baidu.com/oauth/2.0/authorize? response_type=code& client_id=Va5yQRHlA4Fq4eR3LT0vuXV4& redirect_uri=http%3A%2F%2Fwww.example.com%2Foauth_redirect& scope=super_msg& display=popup
第三方Web網站接入百度,主要有兩種技術方案:跨域
採用Authorization Code獲取Access Token的受權驗證流程又被稱爲Web Server Flow,適用於全部有Server端的應用,如Web/Wap站點、有Server端的手機/桌面客戶端應用等。其流程示意圖以下:瀏覽器
對於應用而言,其流程由如下兩步組成:
(1)獲取Authorization Code
(2)經過Authorization Code獲取Access Token
1.1 獲取Authorization Code
請求數據包格式:
其獲取方式是經過重定向用戶瀏覽器(或手機/桌面應用中的瀏覽器組件)到「https://openapi.baidu.com/oauth/2.0/authorize」地址上,並帶上如下參數:
|
例如:「client_id」爲「Va5yQRHlA4Fq4eR3LT0vuXV4」的應用要請求某個用戶的默認權限和email訪問權限,並在受權後需跳轉到「http://www.example.com/oauth_redirect」,同時但願在彈出窗口中展示用戶登陸、受權界面,則應用須要重定向用戶的瀏覽器到以下URL:
https://openapi.baidu.com/oauth/2.0/authorize? response_type=code& client_id=Va5yQRHlA4Fq4eR3LT0vuXV4& redirect_uri=http%3A%2F%2Fwww.example.com%2Foauth_redirect& scope=email& display=popup
響應數據包格式:
此時受權服務會根據應用傳遞參數的不一樣,爲用戶展示不一樣的受權頁面。若是用戶在此頁面贊成受權,受權服務則將重定向用戶瀏覽器到應用所指定的「redirect_uri」,並附帶上表示受權服務所分配的Authorization Code的code參數,以及state參數(若是請求authorization code時帶了這個參數)。
例如:繼續上面的例子,假設受權服務在用戶贊成受權後生成的Authorization Code爲「ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn」,則受權服務將會返回以下響應包以重定向用戶瀏覽器到「http://www.example.com/oauth_redirect」地址上:
HTTP/1.1 302 Found Location: http://www.example.com/oauth_redirect?code=ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn
「code」參數能夠在「redirect_uri」對應的應用後端程序中獲取。 注意:每個Authorization Code的有效期爲10分鐘,而且只能使用一次,再次使用將無效。
經過上面第一步得到Authorization Code後,即可以用其換取一個Access Token。獲取方式是,應用在其服務端程序中發送請求(推薦使用POST)到 百度OAuth2.0受權服務的「https://openapi.baidu.com/oauth/2.0/token」地址上,並帶上如下5個必須參數:
|
例如:
https://openapi.baidu.com/oauth/2.0/token? grant_type=authorization_code& code=ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn& client_id=Va5yQRHlA4Fq4eR3LT0vuXV4& client_secret=0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2& redirect_uri=http%3A%2F%2Fwww.example.com%2Foauth_redirect
響應數據包格式
若參數無誤,服務器將返回一段JSON文本,包含如下參數:
|
例如:
HTTP/1.1 200 OK Content-Type: application/json Cache-Control: no-store { "access_token": "1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328", "expires_in": 86400, "refresh_token": "2.385d55f8615fdfd9edb7c4b5ebdc3e39.604800.1293440400-2346678-124328", "scope": "basic email", "session_key": "ANXxSNjwQDugf8615OnqeikRMu2bKaXCdlLxn", "session_secret": "248APxvxjCZ0VEC43EYrvxqaK4oZExMB",
若請求錯誤,服務器將返回一段JSON文本,包含如下參數:
|
例如:
HTTP/1.1 400 Bad Request Content-Type: application/json Cache-Control: no-store { "error": "invalid_grant", "error_description": "Invalid authorization code: ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn" }
經過HTTPS協議發送開放API調用請求時只須要在請求API對應的URL地址時,經過GET參數或POST參數傳遞具體開放API接口的業務級參數及下表中的幾個系統級參數:
參數名 | 參數類型 | 是否必需 | 描述 |
---|---|---|---|
access_token | string | 是 | OAuth2.0驗證受權後得到的token。 |
callback | string | 否 | 第三方經過JS調用開放API時能夠經過指定callback參數來要求平臺端返回JSONP代碼,以解決跨域問題。 |
假設應用經過OAuth2.0協議獲取Access Token時,受權服務器返回的JSON內容爲:
{ "access_token": "1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328", "expires_in": 86400, "refresh_token": "2.385d55f8615fdfd9edb7c4b5ebdc3e39.604800.1293440400-2346678-124328", "scope": "basic email", "session_key": "9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A=", "session_secret": "27e1be4fdcaa83d7f61c489994ff6ed6", }
當前系統時間爲2011-06-21 17:18:09,要求以json格式返回API調用結果,則應用既能夠經過GET方法發送以下請求包來調用獲取當前登陸用戶的基本資料的開放API接口:
GET https://openapi.baidu.com/rest/2.0/passport/users/getInfo?access_token=1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328 HTTP/1.1 Host: openapi.baidu.com User-Agent: Client of Baidu Open Platform Accept: */* Accept-Encoding: gzip,deflate Accept-Charset: utf-8 Connection: close
也能夠經過POST方法發送以下請求包,來獲取開放API調用的響應結果。
POST https://openapi.baidu.com/rest/2.0/passport/users/getInfo HTTP/1.1 Host: openapi.baidu.com User-Agent: Client of Baidu Open Platform Accept: */* Accept-Encoding: gzip,deflate Accept-Charset: utf-8 Content-Length: 91 Connection: close access_token=1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328
因爲每一個API調用都是經過發送HTTP請求或HTTPS來完成的,所以都有可能由於發送的參數不合法、發送頻率過快次數過多、平臺REST服務自身出問題等緣由而致使API調用失敗,此時百度REST服務器將按照format參數所指定的響應格式返回相應錯誤信息,包含以下參數:
|
(百度API列表見 http://developer.baidu.com/wiki/index.php?title=docs/oauth/rest/file_data_apis_list)
以調用獲取當前登陸用戶基本資料的API接口爲例,假設經過https請求發送API調用請求時所傳遞的access_token已通過期。 則將返回以下格式的錯誤信息:
{ "error_code": "110", "error_msg": "Access token invalid or no longer valid", }
(參考:http://developer.baidu.com/wiki/index.php?title=%E7%99%BE%E5%BA%A6Open_API%E9%94%99%E8%AF%AF%E7%A0%81%E5%AE%9A%E4%B9%89)
Error Code | Error Description(Chinese) | Error Description(English) |
---|---|---|
0 | 成功 | Success |
1 | 未知錯誤 | Unknown error |
2 | 服務暫不可用 | Service temporarily unavailable |
3 | 未知的方法 | Unsupported openapi method |
4 | 接口調用次數已達到設定的上限 | Open api request limit reached |
5 | 請求來自未經受權的IP地址 | Unauthorized client IP address:%s |
6 | 無權限訪問該用戶數據 | No permission to access data |
7 | 來自該refer的請求無訪問權限 | No permission to access data for this referer |
100 | 請求參數無效 | Invalid parameter |
101 | api key無效 | Invalid API key |
102 | session key無效 | Session key invalid or no longer valid |
103 | call_id參數無效 | Invalid/Used call_id parameter |
104 | 無效簽名 | Incorrect signature |
105 | 請求參數過多 | Too many parameters |
106 | 未知的簽名方法 | Unsupported signature method |
107 | timestamp參數無效 | Invalid/Used timestamp parameter |
108 | 無效的user id | Invalid user id |
109 | 無效的用戶資料字段名 | Invalid user info field |
110 | 無效的access token | Access token invalid or no longer valid |
111 | access token過時 | Access token expired |
112 | session key過時 | Session key expired |
114 | 無效的ip參數 | Invalid Ip |
210 | 用戶不可見 | User not visible |
211 | 獲取未受權的字段 | Unsupported permission |
212 | 沒有權限獲取用戶的email | No permission to access user email |
800 | 未知的存儲操做錯誤 | Unknown data store API error |
801 | 無效的操做方法 | Invalid operation |
802 | 數據存儲空間已超過設定的上限 | Data store allowable quota was exceeded |
803 | 指定的對象不存在 | Specified object cannot be found |
804 | 指定的對象已存在 | Specified object already exists |
805 | 數據庫操做出錯,請重試 | A database error occurred. Please try again |
900 | 訪問的應用不存在 | No such application exists |
950 | 批量操做已開始,請先調用end_batch接口結束前一個批量操做 | begin_batch already called, please make sure to call end_batch first |
951 | 結束批量操做的接口調用不該該在start_batch接口以前被調用 | end_batch called before start_batch |
952 | 每一個批量調用不能包含多於20個接口調用 | Each batch API can not contain more than 20 items |
953 | 該接口不適合在批量調用操做中被使用 | Method is not allowed in batch mode |
參考文檔:http://developer.baidu.com/wiki/index.php?title=%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3%E9%A6%96%E9%A1%B5/%E7%99%BE%E5%BA%A6%E5%B8%90%E5%8F%B7%E8%BF%9E%E6%8E%A5