1、OAuth协议简介php
OAuth受权在各社交网站中普遍使用,该协议使用户不须要直接向第三方应用提供用户名及密码,而且使一个帐户在多个网站中使用成为可能,OAuth协议的细节描述可参考其官方网站:http://oauth.nethtml
目前OAuth 1.0已经出了final version,即RFC 5849,OAuth 2.0也已在起草中。java
这篇文章中,我想用比较通俗的语言来解释OAuth协议。web
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.session
回来之后,Consumer拿着RequestToken和Verifier又单独去找Service Provider,取回来一对Access_Token和Access_Token_Secret,并长期保存。并发
至此,三方信任关系就创建起来了,Consumer每次在Service Provider中更新User的状态时,只须要提供这对AccessToken,Service Provider便能肯定此Consumer能代替User进行相应的操做。app
在使用相关OAuth库进行开发时,所须要的关键字在以上场景中都有体现,包括:
Consumer_Key, Consumer_Secret, Request_Token, Request_Token_Secret, Verifier, Access_Token, Access_Token_Secret
OAuth受权流程图以下:
2、新浪微博开放平台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
3、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后需修改相关内容:
一、在\WEB-INF\src\weibo4j\Configuration.java文件的65和66行填上本身申请的Consumer_Key和Consumer_Secret
二、若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中。
Java代码
requstAccessToken方法以下,该方法对应oauth/access_token接口,接收存放在session中的RequestToken和从Service Provider带回来的Verifier,并返回从Service Provider索取的AccessToken,该AccessToken应该被持久化存储,而存放在session中的RequestToken则应失效。
Java代码
update方法演示了如何利用AccessToken来更新User的状态,代码浅显易懂。
Java代码
在桌面应用中,相似Web应用的网页跳转没法实现,新浪微博提供了PIN码的机制,流程与以上描述相似,但须要用户本身打开浏览器,而后将获得的PIN码输入到应用中,在sinaoauth项目里,能够直接运行\WEB-INF\src\weibo4j\examples\OAuthUpdate.java进行体验,此源文件内为一个控制台应用程序。
这篇文章从OAuth协议介绍写到新浪微博OAuth受权的Java实现,但愿能起到抛砖引玉的做用,让不熟悉OAuth协议的朋友了解它,也给有意在Java平台上开发新浪微博OAuth受权应用的朋友提供一个参考。一直认为新浪微博的开放平台作得颇有诚意,在广大开发者和网友的支持下,路必定会越走越宽。