新浪微博OAuth認證總結
自從最近Twitter只支持OAuth認證方式以來,各大應用都紛紛轉向OAuth認證方式,而新浪微博的開放平臺也將在近日停止Base OAuth的認證方式。
為了能夠繼續使用新浪微博的開放平臺,開始研究OAuth的認證方式,經過一段時間的實踐,對于新浪微博開放平臺的OAuth認證方式,有一定的經驗。鑒于網上對于這個平臺的OAuth相關資料比較少,因此在此分享一下過程中積累的經驗,希望可以幫助到一些要使用OAuth認證調用新浪微博接口的人~~
1.關于OAuth:
OAUth認證方式比于Base OAuth的認證方式最大的特點是,應用方并不需要保存用戶的帳戶與密碼,只需要保存經過用戶授權的Key與Secret組合即可對于平臺上的所有接口資源進行訪問,在傳輸過程中也可以避免被不懷好意的人通過截包分析的方式獲取到用戶的帳號與密碼。(有一說Twitter全面改用OAuth認證方式的原因就是防止GFW通過截包獲取到一些相關名人的帳號和密碼)。具體的一些定義可以詳細閱讀OAuth的規范定義:OAuth規范。
2.新浪微博開放平臺:
新浪微博的開放平臺基本上的接口,參數,返回格式都參考了Twitter的模式。當然,國內的另外一些開放平臺都大量參考了Twitter的模式,因此基本上大同小異。要使用新浪微博的開放平臺,當然必須先到它的網站上面進行注冊:新浪微博API。
注冊之后,會得到Consumer Key 與 Consumer Secret這兩個關鍵的字段,好好保存下來吧。
新浪微博的這個開發平臺上面有充分的文檔,能夠很快的上手調用這些接口,除了個別較為難辦的接口,我們下面再討論。
3.對新浪使用OAuth:
使用OAuth,必須先讓用戶進行授權,一般來說授權的過程如下:
(1)由應用向新浪開發平臺發出請求,獲得未授權的Request Token與Request Secret,這個時候Request Secret暫時用不到,好好保存下來。
(2)將上一步獲得的Request Token作為參數,引導用戶瀏覽器跳至新浪微博的授權頁面,用戶進入這個頁面登錄新浪微博,進行Token的授權。如果在(1)中已經向服務器設置了瀏覽器的回調地址的話,則用戶的瀏覽器將會被重定向至該地址,該地址將會新增一個參數:oauth_verifier,這個參數將在后面用到,好好保存。
(3)OAuth認證過程的最后一步,向服務器請求真正的Token,將(1)中得到的Request Token,Request Secret和(2)中得到的oauth_verifier作為參數,傳遞給新浪微博服務器,服務器將會返回真正的Access Token與Access Secret,新浪微博還會返回用戶在新浪微博中的userid。有了用戶的Access Token與Access Secret就可以自由便利地調用新浪微博的開放接口了。
每個調用中,都必須帶有OAuth的認證信息,作為OAuth的認證信息,基本上有兩種方法可以加入到請求包中:
(1)最推薦的方法,采用HTTP的Authorization Header,這個頭部的定義在RFC2617里面有相關定義。
例如:
Authorization: OAuth realm="http://photos.example.net/", oauth_consumer_key="dpf43f3p2l4k3l03", oauth_token="nnch734d00sl2jdk", oauth_signature_method="HMAC-SHA1", oauth_signature="tR3%2BTy81lMeYAr%2FFid0kMTYa%2FWM%3D", oauth_timestamp="1191242096", oauth_nonce="kllo9940pd9333jh", oauth_version="1.0"
(2)或者可以采用,參數傳遞的方式,將OAuth的參數與正常的參數一樣放置與Get的URL中,或者POST的包體內容中,都是可以的,
但遇到一些特殊情況就較難解決這個問題了。
4.OAuth認證參數解析:
在上面可以看到,一個正常的OAuth認證中,包含以下若干參數:
(1)oauth_consumer_key: 即是注冊時,新浪給你的conusmer key,明文傳輸
(2)oauth_token: 即是用戶完成OAuth認證后的Access Token,在進行OAuth認證第三步的時候,為Request Token, 第一步時不需要這個參數
(3)oauth_signature_method:加密的方法,提供HMAC-SHA1, RSA-SHA1, PLAINTEXT 幾種方法
(4)oauth_signature: 對于全部參數進行加密后的字符串,包括consumer secret和access secret
(5)oauth_timestamp:發請求的時間戳
(6)oauth_version:可選的參數,基本上置為1.0,否則會出錯的。
(7)oauth_nonce:隨機的值,防止重復調用
5.上傳圖片OAuth之痛:
使用上面的方法,基本上可以解決所有的接口調用。但遇到難搞的上傳圖片這樣的請求時,就需要一些方法取巧了。
新浪微博的開放平臺,要求上傳圖片時必須使用multipart/form-data的方式進行上傳,但OAuth協議在定義時,描述Content-Type為application/x-www-form-urlencoded, 而并沒有提及如何在multipart/form-data使用。
在網上基本上找不到任何一個地方有提及在新浪微博的開放平臺上以OAuth的方式上傳圖片,經過一個晚上的嘗試與借鑒Twitter上的做法后,
終于發現了解決方法。
基本上,在協議上沒有說明的內容,就必須由民間采用較為直觀的方式進行解決。要在新浪微博的接口中進行圖片上傳,必須使用multipart/form-data作為Content-Type,而OAuth的認證參數不能放入form-data中,必須使用Authorization Header來處理,而這時,必須將除了文件的參數,在這個接口中為status加入到oauth的加密中,但并不出現在Authorization Header中,而是后續加入到fom-data中,這樣就能夠正常的上傳圖片并發表微博了。通過這個簡單而麻煩的方法,終于能夠安全地上傳圖片到新浪微博。
6.最后
至此,本人已成功調用新浪微博絕大多數的接口,并開始將應用覆蓋搜狐微博,網易微博等開放平臺,希望可以通過這篇文章,記錄下一些經驗與教訓。
7.參考資料
[RFC5849] E. Hammer-Lahav, Ed. "The OAuth 1.0 Protocol",RFC5849
[RFC1867] E. Nebel,L. Masinter,"Form-based File Upload in HTML",RFC1867
[RFC2616] Fielding,R.,Gettys,J,e "Hypertext Transfer Protocol -- HTTP/1.1" , RFC2616
[RFC2617] Franks,J."HTTP Authentication: Basic and Digest Access Authentication", RFC2617