第三方登陸——百度爲例

Web網站接入

百度OAuth2.0:

  • OAuth2.0(開放受權)是一個開放標準,用戶受權後,第三方應用無需獲取用戶的用戶名和密碼就能夠訪問該用戶在某一網站上存儲的私密的資源(如照片,視頻,聯繫人列表)。
  • Access Token:用戶身份驗證和受權的憑證。第三方應用在調用百度開放API以前,首先須要獲取Access Token。

1. 受權準備:

  1. 首先成爲百度用戶
  2. 建立一個應用以獲取API Key(client_id)和Secret Key(client_secret)

2. 支持的OAuth受權:

  目前,百度OAuth2.0支持五種獲取Access Token的流程和一種刷新獲取AccessToken方式,第三方可根據需求選取合適的方式:javascript

  百度受權的Access Token是有有效期的,這樣會影響用戶的體驗和增長開發者的工做。因此平臺提供了一種方式能夠保證受權有效期爲永久。php

  • 實現方式:返回給第三方一個月有效期的Access Token + 十年有效期的Refresh Token。
  • 實現原理:Refresh Token的做用就是在Token有效期截止前,刷新以獲取新的Access Token。
獲取途徑 受權流程 介紹 有效期
新獲取 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端配合的應用 。 十年刷新期限。

3. 受權展現方式:

  請求用戶受權時百度提供了一個在OAuth2.0協議中沒有提到的參數:display。它是用來標識不一樣形式的客戶端所對應的不一樣展示形式的受權頁面,其值定義以下java

  • page:全屏形式的受權頁面(默認),適用於web應用。
  • popup: 彈框形式的受權頁面,適用於桌面軟件應用和web應用。
  • dialog:浮層形式的受權頁面,只能用於站內web應用。
  • mobile: Iphone/Android等智能移動終端上用的受權頁面,適用於Iphone/Android等智能移動終端上的應用。
  • tv: 電視等超大顯示屏使用的受權頁面。
  • pad: IPad/Android等智能平板電腦使用的受權頁面。

4. 受權回調地址:

  爲確保驗證受權過程的安全,開發者必須在開發者中心預先註冊應用所在的域名或URL,用以OAuth2.0檢驗受權請求中的「redirect_uri」參數。以便保證OAuth2.0在回調過程當中,會回調到安全域名。web

  • 站外有Web Server應用
    • Web應用 
    • 有Web Server支持的非Web應用(例如:有Web Server支持的手機客戶端、桌面客戶端應用) 。

  開發者在開發者中心的安全設置中填寫了受權回調地址(支持至多十個受權回調地址)。數據庫

  • 站外無Web Server應用
    • 桌面客戶端應用 
    • 手機客戶端應用 
    • 基於瀏覽器腳本語言的應用(JavaScript、Flash、ActionScript)

  平臺提供了一種默認的redirect uri參數爲 "oob",回調後會返回一個平臺提供默認回調地址(http://openapi.baidu.com/oauth/2.0/login_success )。json

5. 權限列表:        

 
用戶受權相關的權限 描述
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網站接入百度,主要有兩種技術方案:跨域

  1. 一種是直接使用百度鏈接開放平臺提供的各類 Open API2.0接口,如用做驗證和受權的 OAuth 2.0,提供數據的底層 Open API2.0
  2. 另外一種是使用百度鏈接開放平臺官方封裝的JavaScript SDK。

接入教程:

  1. 用戶受權,獲取access token
  2. 調用Open API2.0獲取用戶信息

1.用戶受權,獲取access token

     採用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:必須參數,註冊應用時得到的API Key。
  • response_type:必須參數,此值固定爲「code」。
  • redirect_uri:必須參數,受權後要回調的URI,即接收Authorization Code的URI
  • scope:非必須參數,以空格分隔的權限列表,若不傳遞此參數,表明請求用戶的默認權限。關於權限的具體信息請參考「權限列表」。
  • state:非必須參數,用於保持請求和回調的狀態,受權服務器在回調時(重定向用戶瀏覽器到「redirect_uri」時),會在Query Parameter中原樣回傳該參數。
  • display:非必須參數,登陸和受權頁面的展示樣式,默認爲「page」,

  例如:「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分鐘,而且只能使用一次,再次使用將無效。

1.2 使用Authorization Code換取Access Token

    經過上面第一步得到Authorization Code後,即可以用其換取一個Access Token。獲取方式是,應用在其服務端程序中發送請求(推薦使用POST)到 百度OAuth2.0受權服務的「https://openapi.baidu.com/oauth/2.0/token」地址上,並帶上如下5個必須參數:

  • grant_type:必須參數,此值固定爲「authorization_code」;
  • code:必須參數,經過上面第一步所得到的Authorization Code;
  • client_id:必須參數,應用的API Key;
  • client_secret:必須參數,'應用的Secret Key;
  • redirect_uri:必須參數,該值必須與獲取Authorization Code時傳遞的「redirect_uri」保持一致。

        例如:

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文本,包含如下參數:

  • access_token:要獲取的Access Token;
  • expires_in:Access Token的有效期,以秒爲單位;請參考「Access Token生命週期方案
  • refresh_token:用於刷新Access Token 的 Refresh Token,全部應用都會返回該參數;(10年的有效期
  • scope:Access Token最終的訪問範圍,即用戶實際授予的權限列表(用戶在受權頁面時,有可能會取消掉某些請求的權限),關於權限的具體信息參考「權限列表」一節;
  • session_key:基於http調用Open API時所須要的Session Key,其有效期與Access Token一致;
  • session_secret:基於http調用Open API時計算參數簽名用的簽名密鑰。

        例如:

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文本,包含如下參數:
  • error:錯誤碼;關於錯誤碼的詳細信息請參考「百度OAuth2.0錯誤響應」一節。
  • error_description:錯誤描述信息,用來幫助理解和解決發生的錯誤。
   例如:
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
 
{
    "error": "invalid_grant",
    "error_description": "Invalid authorization code: ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn"
}

1.3 開發者須要注意的事項

  •  默認狀況下,Access Token的有效期爲永久(一個月的Access Token + 10年的Refresh Token)。關於Token方案的詳細信息,請參考「Access Token生命週期方案」一節。
  • 獲取Access Token時所返回的session_key和session_secret參數不是OAuth2.0協議標準規定的返回參數,而是百度OAuth2.0服務擴展加入的,目的是使得開發者能夠基於http調用百度的Open API,由於基於https調用Open API雖然更爲簡單,但畢竟響應速度更差(比基於http的要差一倍時間左右)。

2. 調用Open API2.0獲取用戶信息

2.1 經過HTTPS請求調用開放API 

  經過HTTPS協議發送開放API調用請求時只須要在請求API對應的URL地址時,經過GET參數或POST參數傳遞具體開放API接口的業務級參數及下表中的幾個系統級參數:

參數名 參數類型 是否必需 描述
access_token string OAuth2.0驗證受權後得到的token。
callback string 第三方經過JS調用開放API時能夠經過指定callback參數來要求平臺端返回JSONP代碼,以解決跨域問題。

2.2 經過HTTPS請求調用開放API示例

  假設應用經過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

2.3 開放API調用的響應結果

2.3.1 正常響應結果

      請參考每一個具體開放API的詳細說明文檔

2.3.2 異常響應結果

  因爲每一個API調用都是經過發送HTTP請求或HTTPS來完成的,所以都有可能由於發送的參數不合法、發送頻率過快次數過多、平臺REST服務自身出問題等緣由而致使API調用失敗,此時百度REST服務器將按照format參數所指定的響應格式返回相應錯誤信息,包含以下參數:

  • error_code: 錯誤碼,查看全部錯誤碼定義請參考[常見錯誤碼說明];
  • error_msg: 對調用失敗緣由的描述。

2.3.3 開放API調用的響應結果示例

      (百度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",
}

 2.4 百度Open API錯誤碼定義:

(參考: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

相關文章
相關標籤/搜索