本文檔提供豆瓣API OAuth認(rèn)證的相關(guān)信息,如果你的應(yīng)用需要訪問或修改受保護(hù)的用戶數(shù)據(jù),請?jiān)敿?xì)閱讀本文檔。
為了保護(hù)豆瓣用戶的數(shù)據(jù),當(dāng)?shù)谌綉?yīng)用需要通過API訪問或修改受保護(hù)的用戶數(shù)據(jù)(例如增刪用戶收藏)時(shí),需要通過OAuth認(rèn)證機(jī)制來獲得用戶的授權(quán)。
為了方便開發(fā)人員進(jìn)行豆瓣 OAuth認(rèn)證,我們在豆瓣OAuth認(rèn)證示例項(xiàng)目中提供了常見語言環(huán)境下進(jìn)行豆瓣 OAuth認(rèn)證的示例代碼。如果你使用或參考示例項(xiàng)目中的代碼,而你對OAuth一無所知,那么你需要閱讀我們在下面提供的認(rèn)證及訪問資源流程這部分內(nèi)容。它可以幫助你理解OAuth的認(rèn)證流程,這對于理解示例項(xiàng)目中的代碼是必須的。同時(shí)你也需要閱讀常見問題部分。
如果你不打算參考我們提供的示例代碼,或者你所使用的語言不在我們提供的示例代碼中。那么在開始嘗試進(jìn)行OAuth認(rèn)證之前,你通常必須閱讀整個(gè)OAuth規(guī)范。
無論你是何種開發(fā)人員——比如你也許已經(jīng)是OAuth專家,我們都建議你閱讀常見問題部分,以避免不必要的麻煩。
如果你發(fā)現(xiàn)本文檔的某些部分難以理解,建議你閱讀OAuth規(guī)范以獲取更多信息。
另外一些可能有用的資源:
豆瓣API通過以下四個(gè)步驟來完成認(rèn)證授權(quán)并訪問或修改受限資源的流程
通過訪問以下 URL 獲取未授權(quán)的 Request Token
http://www.douban.com/service/auth/request_token
包含的主要參數(shù)
參數(shù) | 意義 |
oauth_consumer_key | API Key |
oauth_signature_method | 簽名方法,建議使用HMAC-SHA1 |
oauth_signature | 簽名值 |
oauth_timestamp | 時(shí)間戳 |
oauth_nonce | 單次值,隨機(jī)字符串,防止重放攻擊 |
本步驟用于簽名的secret是API Key Secret
返回值包括未授權(quán)的Request Token和對應(yīng)的Request Token Secret
獲得Request Token之后,需要請求用戶授權(quán)該Request Token
你需要將瀏覽器跳轉(zhuǎn)到如下URL(如果無法自動跳轉(zhuǎn),則需要提示用戶手工跳轉(zhuǎn))。這會是一個(gè)豆瓣上的頁面,提示用戶授權(quán)給你的應(yīng)用,以允許你的應(yīng)用訪問該用戶在豆瓣上的信息
http://www.douban.com/service/auth/authorize
跳轉(zhuǎn)后用戶會看到請求授權(quán)的頁面,用戶可以選擇同意或者拒絕授權(quán)
該請求包含如下兩個(gè)參數(shù)
參數(shù) | 意義 |
oauth_token | 上一步中獲得的Request Token |
oauth_callback(可選) | 如果包含這個(gè)參數(shù),認(rèn)證成功后瀏覽器會被重定向到形如http://callback?oauth_token=ab3cd9j4ks73hf7g的url,其中oauth_token為Request Token 否則需要用戶手工通知第三方應(yīng)用以完成授權(quán) |
用戶完成授權(quán)后,第三方應(yīng)用可以通過訪問如下url,將已授權(quán)的Request Token換取Access Token。Access Token將被用于訪問或修改受限資源
http://www.douban.com/service/auth/access_token
包含的主要參數(shù)
參數(shù) | 意義 |
oauth_consumer_key | API Key |
oauth_token | 第一步中獲得的Request Token |
oauth_signature_method | 簽名方法 |
oauth_signature | 簽名值 |
oauth_timestamp | 時(shí)間戳 |
oauth_nonce | 單次值 |
本步驟用于簽名的secret和token secret分別為,API Key Secret和Request Token Secret
返回值包括授權(quán)的Access Token,對應(yīng)的Access Token Secret
獲得Access Token之后,你的應(yīng)用就可以使用該Access Token訪問或修改受保護(hù)的資源
在每次操作受保護(hù)資源時(shí),請求都必須包含以下參數(shù)
參數(shù) | 意義 |
oauth_consumer_key | API Key |
oauth_token | Access Token |
oauth_signature_method | 簽名方法 |
oauth_signature | 簽名值 |
oauth_timestamp | 時(shí)間戳 |
oauth_nonce | 單次值 |
本步驟用于簽名的secret和token secret分別為,API Key Secret和Access Token Secret
在第一步獲取Request Token時(shí),需要使用API Key和API Key Secret進(jìn)行簽名。對應(yīng)到OAuth規(guī)范中,API Key對應(yīng)Consumer Key,API Key Secret對應(yīng)Consumer Key Secret。該步不需要使用Token和Token Secret——設(shè)為空字符串即可。
在第三步換取Access Token時(shí),需要使用API Key、API Key Secret、Request Token和Request Token Secret進(jìn)行簽名。其中API Key和API Key Secret的對應(yīng)不變。而Request Token和Request Token Secret對應(yīng)簽名中的Token和Token Secret
而在第四步訪問修改受限資源時(shí),需要使用API Key、API Key Secret、Access Token和Access Token Secret進(jìn)行簽名。
請注意區(qū)分三次簽名中用到的Key、Token和Secret,這是簽名不匹配的一個(gè)常見原因。
簽名時(shí)需要用到將要訪問的url。例如:
http://api.douban.com/people/sakinijino/collection
豆瓣OAuth認(rèn)證,要求對這個(gè)url進(jìn)行轉(zhuǎn)義再計(jì)算簽名,例如:
http://api.douban.com/people/@me
需要被轉(zhuǎn)義為
http://api.douban.com/people/%40me
再計(jì)算簽名。某些OAuth庫默認(rèn)不對url進(jìn)行轉(zhuǎn)義,你需要在傳入url之前手工進(jìn)行轉(zhuǎn)義。這是簽名不匹配的另一個(gè)原因。
OAuth規(guī)范定義了三種傳遞OAuth參數(shù)方式
然而進(jìn)行POST、PUT、DELETE請求時(shí),豆瓣暫時(shí)不支持使用在url中或者post form中傳遞OAuth參數(shù)。因此你只能選擇在header中傳遞OAuth參數(shù)。格式如下:
Authorization: OAuth realm="http://sp.example.com/", oauth_consumer_key="0685bd9184jfhq22", oauth_token="ad180jjd733klru7", oauth_signature_method="HMAC-SHA1", oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D", oauth_timestamp="137131200", oauth_nonce="4572616e48616d6d65724c61686176", oauth_version="1.0"
如果你發(fā)現(xiàn)豆瓣提示你沒有傳遞OAuth參數(shù)(no auth錯(cuò)誤),那么請檢查一下你是否在POST、PUT、DELETE請求中使用了url或post form傳遞OAuth參數(shù)。