api 實現不標準還能忍,但是文件不說明清楚,要開發者自己摸索就離譜了。1
我寫這一系列文章的目的就是避免後來者遭同樣的罪。
這是第一篇,關於 upload api
的 oauth 驗證失敗問題。去論壇搜尋一下 upload 就知道有多少人深受其害了。2
upload api 的特殊性在於其請求「採用 multipart/form-data
編碼方式提交」3
。根據 oauth 1.0
協議,content-type 為 multipart/form-data 的 http 請求,其 entity body 不參與 oauth 簽名。照此,upload api 的 oauth 應該比其他普通 api 更簡單,因為只有 oauth 引數(oauth_ 開頭的一系列特別引數)參與簽名。所以,標準的 signature base string 應該是:
與其對應的標準的 authorization header 應該是:
oauth oauth_consumer_key=*********x, oauth_token=yyyyyyyyyy, oauth_signature_method=hmac-sha1, oauth_version=1.0, oauth_nonce=15492994958798014939, oauth_timestamp=1312912324, oauth_signature=2rxnudxqdeslxsxxrsgpiwua3hi%3d」
然而,迎接你的將是:
40107:oauth error: signature_invalid!
lat%3d37.78711200
%26
long%3d-122.40846000
%26oauth_consumer_key%3d*********x%26oauth_nonce%3d18218585476538551879%26oauth_signature_method%3dhmac-sha1%26oauth_timestamp%3d1312912886%26oauth_token%3dyyyyyyyyyy%26oauth_version%3d1.0%26
status%3dpic
問題來了:status、lat、long 這些引數是在 entity body 中提交的,如前所述,它們不參與 oauth 簽名。為了遵循 oauth 協議,必須將這些引數加入 url query string 或 authorization header。
」,雖然 pic 跟 oauth 毛關係都沒有,雖然根據標準 filename 不是必須的,雖然事實上 filename 在這裡是沒用的。
所有引數用 multipart/form-data 格式提交,不能出現在 url query string 或 authorization header。
除 pic 以外的所有引數進入 signature base string 參與 oauth 簽名。
pic 的 content-disposition header 必須包含 filename 引數。
官方論壇
沒什麼幫助,哭的多,救的少。 ↩
由於沒做 utf-8 編碼或 url 編碼造成的 oauth 驗證失敗是開發者自己的錯誤。 ↩
本文也同樣適用於其他採用 multipart/form-data 編碼方式提交 http 請求的 api,如 update_profile_image
。轉之原文
新浪微博API的使用
在開發平台可以看見很多微博api 點開微博介面看見下面詳細介面 以獲取最新公共微博為例 獲取當前登入使用者及其所關注使用者的最新微博。parameters since id若指定此引數,則返回id比since id大的微博 即比since id時間晚的微博 預設為0 max id若指定此引數,則返回...
Python使用新浪微博API傳送微博的例子
1 註冊乙個新浪應用,得到appkey和secret,以及token,將這些資訊寫入配置檔案sina weibo config.ini,內容如下,僅舉例 複製 如下 userinfo consumer key 8888888888 consumer secret 777777f3feab026050...
呼叫新浪微博開放平台介面
微博開放平台 3.準備資料 1 準備使用者驗證資料 string username t cnblogs.com string password cnblogs.com string usernamepassword username password username是你的微博登入使用者名稱,pas...