Steven Wang's Blog
C'est la vie
rss
email
twitter
新浪微博
  • Home
  • About
  • Google Profile
  • 新浪微博

新浪微博OAuth授权的Java实现

8 Comments
Posted on 九月 14 2010

一、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改编自著名的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授权应用的朋友提供一个参考。一直认为新浪微博的开放平台做得很有诚意,在广大开发者和网友的支持下,路一定会越走越宽。

--End--
作者:Steven Wang | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息及版权声明
网址:http://blog.stevenwang.name/sina-oauth-java-414001.html

Relate Posts:

  • 围着脖子推V2.0 Beta1版发布 支持Twitter,新浪微博,人人网,嘀咕,做啥 同步更新
  • 围着脖子推V1.0正式版发布并开放源代码

Tags: 新浪微博  OAuth 
Categories: Others 

8 Comments

  1. 小米 says:
    九月 14 2010 at 17:30 Reply

    oauth真是好东西
    我正琢磨着写点什么
    没啥需求啊。。。
    而且
    java还不会
    想了解一下
    哈哈

  2. 黎明破晓 says:
    九月 14 2010 at 07:39 Reply

    受益匪浅,谢谢

  3. john says:
    九月 15 2010 at 18:24 Reply

    好复杂,基本看不懂

  4. john says:
    九月 22 2010 at 18:44 Reply

    今天是中秋节,祝博主中秋节快乐!

  5. Steven Wang says:
    九月 22 2010 at 18:50 Reply

    @john, 也祝你中秋快乐,阖家欢乐!

  6. Zihao says:
    十一月 26 2010 at 13:51 Reply

    博主你好,我没有弄清楚用来获取access token的verifier是从哪里来,能不能请你再具体解释一下?谢谢

  7. Steven Wang says:
    十一月 26 2010 at 19:25 Reply

    @Zihao, Service Provider在请求backUrl时,会带上Verifier,你的程序只要从请求参数里读取就行。

  8. darkkgg says:
    十二月 14 2010 at 10:19 Reply

    这篇文讲的还是比较浅显易懂 再结合以下oauth的文档 还是可以比较全面的理解oauth的整个流程 写的不错的说...

Leave a Reply



About Me

    Steven Wang
    Student in Computer Software and Theory
    Life@Wuxi, Jiangsu
    Study@Jiangnan University
    more...

Feeds

  • Entries (RSS)
  • Comments (RSS)
  • 订阅到 Google Reader
  • 订阅到 抓虾
  • 订阅到 鲜果
  • 订阅到 QQ

Popular Posts

  • 围着脖子推GTalk机器人V1.0发布(27297)
  • 通过SSH + Chrome + Proxy Switchy!代理上网(19676)
  • 在GAE上部署Micolog博客系统(11307)
  • 围着脖子推V2.0 Beta1版发布 支持Twitter,新浪微博,人人网,嘀咕,做啥 同步更新(11059)
  • 围着脖子推GTalk机器人V1.0更新-增加接收Twitter更新等功能(10662)
  • 围着脖子推更新-增加同步更新网易微博、腾讯微博和搜狐微博(10478)
  • 在Matlab中实现Hough变换检测直线(8448)
  • Micolog主题(theme) —— translucence(7838)

Recent Posts

  • Steven Wang's 2011
  • 工作
  • T400升级Intel SSD
  • Java中的时区转换小结
  • 二值图像连通区标记之区域生长法
  • Steven Wang's 2010
  • 微博提醒应用上线
  • 双喜临门

Recent Comments

  • cheap movie dvd:K. one about people ...
  • cheap blu ray:the half Brazilian a...
  • wholesale cheap dvd:I think a lot of peo...
  • wholesale tv boxsets:Thats it. we decided...
  • cheap blu ray:Johanna Mason: Im su...

Categories

  • Google App Engine(10)
  • 数字图像处理(11)
  • Micolog(7)
  • VPS(6)
  • 围着脖子推(15)
  • 人工神经网络(5)
  • 算法(11)
  • MyLife(16)
  • 媒体检索(4)
  • Others(8)
  • Python(2)

Archives

  • January 2012(1)
  • December 2011(2)
  • May 2011(1)
  • February 2011(1)
  • December 2010(3)
  • November 2010(1)
  • October 2010(1)
  • September 2010(4)
  • August 2010(2)
  • July 2010(5)
  • June 2010(4)
  • May 2010(7)

Blog roll

  • ~Issue
  • Fenng
  • 刘未鹏 | Mind Hacks
  • 林海听松
  • Yu Zheng
  • Johnny Han
  • 静静的安静
  • Dbger
  • land of promise
  • 星星
  • ISHENS|TECH
  • 天天软件园
  • leezhenchong's blog
  • 苏洋博客

  • Home
  • About
  • Google Profile
  • Twitter
  • 新浪微博
  • Login
Powered by Google App Engine  |   Designed by WebTreats  |   由 xuming 提供 Micolog程序