java 的新浪oauth_新浪微博OAuth授权的Java实现
一、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授權方式。
關于OAuth授權的三個接口:
oauth/request_token:Consumer使用該接口向Service Provider索取RequestToken
oauth/authorize:Consumer帶上RequestToken,領著User,三者再此接口見面
oauth/access_token:Consumer拿著RequestToken和Verifier,在此接口向Service Provider索取AccessToken
三、Java平臺上的新浪微博OAuth授權
此SDK改編自著名的twitter4j,封裝了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中。
public static RequestToken request(String backUrl)
{
try
{
Weibo weibo = new Weibo();
RequestToken requestToken =
weibo.getOAuthRequestToken(backUrl);
return requestToken;
}
catch (Exception e)
{
return null;
}
}
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授權應用的朋友提供一個參考。一直認為新浪微博的開放平臺做得很有誠意,在廣大開發者和網友的支持下,路一定會越走越寬。
大小: 70.3 KB
分享到:
2011-02-28 21:17
瀏覽 10409
評論
6 樓
邱一河
2014-04-20
sinaoauth的web項目 下載不了啊,幫忙發個噻,謝謝啊
361918593@qq.com
5 樓
lxchuan
2012-04-24
我用sinaoauth的web項目,登錄授權后,如何獲取用戶信息呢?能方便加我一下qq嗎?我的qq是3793627
4 樓
hostkey
2011-09-29
如果方便,,我可以加你QQ嗎?我的QQ:541052403
3 樓
hostkey
2011-09-29
大俠,,我現在就在做一個應用是用新浪微博帳號登錄授權之后到我應用主頁拿到用戶的信息,,,我想的是我給他提供一個登錄框然后他輸入他新浪微博的帳號和密碼之后就可以直接到我的應用主頁,,至于授權這一步我怎么在代碼內部實現授權。就向圖釘網那樣...??你可以看看圖釘網的那個??
2 樓
四眼蛤蟆
2011-08-18
省略掉Oauth認證這個步驟是不行的,這個步驟必須要。
1 樓
hecongqi
2011-08-12
可不可以就是通過新浪微博賬號和密碼就直接可以發送微博,直接上傳圖片,省略掉Oauth認證這個步驟
總結
以上是生活随笔為你收集整理的java 的新浪oauth_新浪微博OAuth授权的Java实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 传奇开个服大概需要多少费用?
- 下一篇: 数学建模竞赛