一、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实现相关推荐

  1. 2022年新浪股票接口更新需要加Referer才能获取数据, java获取新浪股票数据 http://hq.sinajs.cn

    新浪股票 2022年更新后 java获取数据 引用 <dependency><groupId>cn.hutool</groupId><artifactId&g ...

  2. java获取新浪天气预报代码

    package com.test.commons;/*** java获取新浪天气预报代码*/ import java.io.FileNotFoundException; import java.io. ...

  3. java+微博上传图片_java实现新浪微博Oauth接口发送图片和文字的方法

    本文实例讲述了java实现新浪微博oauth接口发送图片和文字的方法.分享给大家供大家参考.具体如下: 基于网上很多人利用新浪api开发新浪微博客户端的时候遇到无法发图片的问题,很多人卡在了这一布.现 ...

  4. Java模拟新浪和腾迅自动登录并发送微博(2013年3月更新可用)

    1.准备工作 只是登录无需申请新浪和腾迅的开发者账号,如果需要发送微博功能,需要申请一个新浪和腾迅的开发者账号,并添加一个测试应用. 过程请参考官方帮助文档,申请地址:新浪:http://open.w ...

  5. Java 模拟新浪登录 2016

    想学习一下网络爬虫,涉及到模拟登录,查阅了一番资料以后发现大部分都有点过时了,就使用前辈们给的经验,Firefox抓包调试,采用httpclient模拟了一下新浪登录.不对之处多多包含.需要的可以用浏 ...

  6. 新浪博客开发 授权认证 OAuth2.0

    昨天晚上就看了Touch Android 的开发视频 获得新浪开发的授权,今天整了一天 结果还不行,刚刚仔细看看新浪的官方文档,视频中讲解的是基于OAuth1.0授权方式,而现在新浪等各大门户网站全部 ...

  7. java 学习 新浪微群

    java 新浪微群    http://q.weibo.com/803436/invitation=11mQrw0-1f2c0?source=weiqun_notice_app_18

  8. java 利用新浪天气API获取天气预报

    新浪为我们提供了天气预报获取接口API  http://php.weather.sina.com.cn/xml.php?city=武汉&password=DJOYnieT8234jlsK&am ...

  9. java 8 新功能详解_Java 8和Java 14之间的新功能

    java 8 新功能详解 从版本9开始,Java每6个月就有一次新功能,因此很难跟踪这些新更改. 互联网上的大多数信息都描述了最近2个Java版本之间的变化. 但是,如果您的情况与我相似,则说明您使用 ...

最新文章

  1. 时隔两年,EfficientNet v2来了!更快,更小,更强!
  2. KEIL与ADS1.2共存
  3. Java---------- LeetCode——746. 使用最小花费爬楼梯
  4. Ubuntu之Gitlab、Gerrit、Jenkins协调工作配置
  5. mysql备份数据库命令
  6. html文件url_for加载静态文件
  7. 【Qt】2D绘图之渐变填充
  8. 【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程...
  9. mysql事件定时_MySQL事件(定时任务)
  10. eclipse中不能找到dubbo.xsd报错”cvc-complex-type.2.4.c“的 两种解决方法
  11. ubuntu18.04 ROS melodic—创建简单的机器人模型smartcar
  12. 【wpf】在win10系统上弹出toast和notification
  13. 【优化算法】差分蜂群优化算法(DEABC)【含Matlab源码 1423期】
  14. 凸二次规划的解法(旋转算法)
  15. P2422 良好的感觉
  16. 复变函数思维导图梳理
  17. 寻找影响免疫浸润细胞的基因(一)
  18. MATLAB 2018a Mac版安装激活教程
  19. 063.django之模板层
  20. python中的random模块_如何运用PYTHON里的random模块

热门文章

  1. 为什么有的人说话一定要带手势?生物学基础找到了
  2. 51nod 1875 丢手绢
  3. VBA的form相关实验2,form里的变量传递和模块里有什么不同?(---未完成-----)
  4. 解决方案 word excel vba 以下隐藏模块存在编译错误
  5. 沙箱验证签名失败和沙箱验证签名生成失败
  6. python 计算器 eval ctf_python 的eval函数
  7. BUUCTF:[SWPU2019]神奇的二维码
  8. 创新案例分享 | 临床研究数据信息互联互通,共创医疗新局面
  9. 精力管理--分享感悟
  10. 软件需求工程 高校教学平台 培训计划