新浪微博OAuth授權的Java實現
<DIV class=entry>
一、OAuth協議簡介
OAuth授權在各社交網站中廣泛使用,該協議使用戶不需要直接向第三方應用提供用戶名及密碼,并且使一個賬戶在多個網站中使用成為可能,OAuth協議的細節描述可參考其官方網站:http://oauth.net
目前OAuth 1.0已經出了final version,即RFC 5849,OAuth 2.0也已在起草中。
這篇文章中,我想用比較通俗的語言來解釋OAuth協議。
OAuth協議中包含了三個角色:
Service Provdier,即服務提供者,如新浪微博;
User,即普通用戶,如新浪微博用戶;
Consumer,即第三方應用,如本人開發的應用。
現有如下場景:User想利用Consumer來更新自己在Service Provider中的狀態,但此時Service Provider并不信任Consumer,且User也不想把帳號和密碼告訴Consumer,于是三者之間需要建立起信任關系。
Consumer首先要向Service Provider申請一對Consumer_Key和Consumer_Secret,以此取得Service Provider的信任。因為User是信任Service Provider的,所以User與Consumer間的信任關系需要借助Service Provider來建立。
Consumer用自己的Consumer_Key和Consumer_Secret向Service Provider請求到一對Request_Token和Request_Token_Secret,而后Consumer拿上這對RequestToken,領著User去見Service Provider。Service Provider見到自己發的RequestToken,便確認Consumer是值得信任的,于是把頭轉向User。如果Service Provider不記得User了,只要User向Service Provider提供用戶名和密碼,就能建立起信任關系。然后Service Provider對User說:“我很信任這個Consumer,你是不是也要信任他?”,若User確認,則Service Provider允許Consumer把User帶回去,并發給Consumer一個Verifier.
回來以后,Consumer拿著RequestToken和Verifier又單獨去找Service Provider,取回來一對Access_Token和Access_Token_Secret,并長期保存。
至此,三方信任關系就建立起來了,Consumer每次在Service Provider中更新User的狀態時,只需要提供這對AccessToken,Service Provider便能確定此Consumer能代替User進行相應的操作。
在使用相關OAuth庫進行開發時,所需要的關鍵字在以上場景中都有體現,包括:
Consumer_Key, Consumer_Secret, Request_Token, Request_Token_Secret, Verifier, Access_Token, Access_Token_Secret
OAuth授權流程圖如下:
二、新浪微博開放平臺OAuth授權接口
新浪微博開放平臺文檔中聲明“注意由于OAuth 1.0版有安全漏洞,我們僅支持最新的1.0a協議”,其中OAuth 1.0a 就是目前的RFC 5849.
新浪微博OAuth授權機制說明可參考:
http://open.t.sina.com.cn/wiki/index.php/授權機制說明
為了方便使用,新浪微博提供了網頁應用和桌面應用兩種OAuth授權方式。
關于OAuth授權的三個接口:
oauth/request_token:Consumer使用該接口向Service Provider索取RequestToken
oauth/authorize:Consumer帶上RequestToken,領著User,三者再此接口見面
oauth/access_token:Consumer拿著RequestToken和Verifier,在此接口向Service Provider索取AccessToken
三、Java平臺上的新浪微博OAuth授權
新浪微博開放平臺提供了一個功能強大的Java SDK,即weibo4j,下載頁面:
http://open.t.sina.com.cn/wiki/index.php/SDK#Java_SDK
此SDK改編自著名的推ter4j,封裝了OAuth等其他常用的API,并包含一些示例程序。
下載weibo4j并解壓,readme.txt文件內有該SDK的簡要說明,其中包括了OAuth授權的示例用法。為了更方便的體驗OAuth授權,我將其中關于OAuth授權的示例提出,單獨建了一個名為sinaoauth的web項目,點擊下載
下載sinaoauth后需修改相關內容:
1、在\WEB-INF\src\weibo4j\Configuration.java文件的65和66行填上自己申請的Consumer_Key和Consumer_Secret
2、若Web服務器的地址不是http://localhost:8080,則對\call.jsp文件的第9行中的url進行修改
修改完成后,將sinaoauth項目復制到Web服務器的webapps下運行,在瀏覽器中輸入:http://localhost:8080/sinaoauth/call.jsp 即可開始體驗新浪微博OAuth授權。
進一步對代碼進行分析,call.jsp和callback.jsp兩個jsp頁面負責與用戶的交互,call.jsp將User帶到Service Provider,而callback.jsp負責迎接從Service Provider返回的User,其中用到一個名為weboauth的JavaBean,這是OAuth授權的核心控制部分,對應的java源文件是\WEB-INF\src\weibo4j\examples\WebOAuth.java
WebOAuth類中的request方法如下,該方法對應oauth/request_token接口,接收一個callbackurl參數,即User從Service Provider授權回來后的入口,返回從Service Provider獲取的RequestToken,并利用oauth/authorize接口構造授權地址。此后,在call.jsp里將該RequestToken臨時存放于session中。
<PRE style="BACKGROUND-COLOR: #c5c5c5; FONT-WEIGHT: bold" class=java name="code">public static RequestToken request(String backUrl) { try { Weibo weibo = new Weibo(); RequestToken requestToken = weibo.getOAuthRequestToken(backUrl); return requestToken; } catch (Exception e) { return null; } }</PRE><DIV id=highlighter_608421 class="syntaxhighlighter java">
這篇文章從OAuth協議介紹寫到新浪微博OAuth授權的Java實現,希望能起到拋磚引玉的作用,讓不熟悉OAuth協議的朋友了解它,也給有意在Java平臺上開發新浪微博OAuth授權應用的朋友提供一個參考。一直認為新浪微博的開放平臺做得很有誠意,在廣大開發者和網友的支持下,路一定會越走越寬。
--End--