新浪微博OAuth授權的Java實現

openkk 13年前發布 | 6K 次閱讀 DB Sanity JavaScript

<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_Authentication_Flow

二、新浪微博開放平臺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">

 
requstAccessToken方法如下,該方法對應oauth/access_token接口,接收存放在session中的RequestToken和從Service Provider帶回來的Verifier,并返回從Service Provider索取的AccessToken,該AccessToken應該被持久化存儲,而存放在session中的RequestToken則應失效
public static AccessToken requstAccessToken
    (RequestToken requestToken, String verifier) 
{
    try
    {
        Weibo weibo = new Weibo();
        AccessToken accessToken = 
            weibo.getOAuthAccessToken(
                requestToken.getToken(), 
                requestToken.getTokenSecret(), 
                verifier);
        return accessToken;
    } 
    catch (Exception e)
    {
        return null;
    }
}
 
update方法演示了如何利用AccessToken來更新User的狀態,代碼淺顯易懂
public static void update(AccessToken access, String content) 
{
    try 
    {
        Weibo weibo = new Weibo();
        weibo.setToken(access.getToken(), 
            access.getTokenSecret());
        Status status = weibo.updateStatus(content);
    } 
    catch (WeiboException e) 
    {
    }
}

在桌面應用中,類似Web應用的網頁跳轉無法實現,新浪微博提供了PIN碼的機制,流程與以上描述類似,但需要用戶自己打開瀏覽器,然后將得到的PIN碼輸入到應用中,在sinaoauth項目里,可以直接運行\WEB-INF\src\weibo4j\examples\OAuthUpdate.java進行體驗,此源文件內為一個控制臺應用程序。

這篇文章從OAuth協議介紹寫到新浪微博OAuth授權的Java實現,希望能起到拋磚引玉的作用,讓不熟悉OAuth協議的朋友了解它,也給有意在Java平臺上開發新浪微博OAuth授權應用的朋友提供一個參考。一直認為新浪微博的開放平臺做得很有誠意,在廣大開發者和網友的支持下,路一定會越走越寬。

--End--