最近接触到微博API的使用,顺带了解下OAuth2的原理~
OAuth认证(Open Authorization 开放授权)
OAuth的验证过程
现在多用 Oauth2.0,在认证和授权的过程中涉及的三方包括:
服务提供方(比如新浪微博):用户使用服务提供方来存储受保护的资源,如个人信息,照片,视频,联系人列表。
用户:受保护的资源的拥有者。用户持有网站(服务提供方)的 帐号和和密码。
客户端(也就是第三方网站):要访问服务提供方资源的第三方应用,通常是网站或者APP。在认证过程之前,客户端要向服务提供者申请客户端标识。用下面的图简单说明:
OAuth授权分如下步骤,按照上图的箭头顺序来描述:
(1)request Token:C向服务提供方S申请请求令牌。未S经授权的request token包括对应的密钥、加密算法、发起请求的时间戳、随即字符串和版本号信息等。
(2)grant request Token:这个时候 S 需要验证 C的合法性(通过开发者的 APP_KEY 和 APP_SECREST)。S验证通过后将令牌返回。这个步骤由于涉及到应用帐号密码,在应用的服务端发起,所以这个步骤对用户透明。
(3)redirected to auth page:浏览器重定向request Token的服务地址。
(4) authorize request_token:C使用请求令牌向S进行登录验证和授权。S校验请求令牌,将第三方C的资料显示给用户U,提示U选择同意或拒绝此次授权。
(5)Aknowledge request_token:如果U同意授权,发放已授权令牌并将U引导到当前应用的注册地址。这个步骤从重定向开始到引导回注册地址之前,C并不参与U身份校验和授权过程,确保C不可获得用户的真实帐号密码,得到授权的 request_token。
(6)redirected to consumer:重定向到用request_token换取AccessToken的服务地址。
(7)access_token:用已授权令牌向S换取access_token。C需在服务端发起请求,用帐号密码和上一步的令牌换取access_token,这个步骤对U而言也是透明的。如果前两步分别是让S认证C和U,那这步就是U和S再次认证C。
因为用户浏览器将第二步的结果重定向到第三步,除非用户DNS被劫持,否则就能确保重定向到的是合法的地址。曾经我很困惑在用户授权之后为何不直接返回access_token而需要再次换取,估计是出于对access_token的安全考虑,用户浏览器一端存在太多的可能性让AccessToken泄漏,最安全的办法还是让第三方服务端来获取和保管access_token。
(7)grantaccess_token:用access_token作为令牌访问受保护资源。很多时候,权限是有多种类别的。access_token包含了某个用户对某个应用的授权凭据,准确的说,access_token对应用户授权时所赋予的一系列权限的集合。所以在这一步,除了校验access_token的合法性之外,服务提供方还需对该access_token是否拥有足够的权限执行被保护操作进行判断。
这样说比较抽象,举个简单的例子:
有一个人 U 想去银行 S 取钱。U 有事情去不了柜台,就委托朋友 C 去柜台。
当C 去了银行S,给S说:我要帮 U 取钱。
S 先验证 C 的身份,是合法公民。
然后 S 打电话给 U说:C 要帮你取钱,你确定么,确定的话就输入用户名和密码。 U 确定了。
此时,S 就给了一个 钥匙给 C,说:我们不提供自动服务,给你钥匙,自己去库房取。
然后 C 拿着钥匙,就去取钱了。取完之后给力 U。U 很感激。
这就是OAuth2的一个简单生动的例子,OAuth2的目标就是为了确保用户在关联第三方网站时保证用户信息安全不泄露,同时方便用户。
新浪微博API Java SDK
weibo4j.org.json表示对Json数据的解析。
weibo4j.model是对微博API接口各个类的封装,比如说User的结构体定义。
weibo4j.http里都是Http请求的类和AccessToken获取的封装。
weibo4j.util 包含了请求api接口时候所需要的工具类。
examples中是各类接口的使用示例。
(1)修改Config.properties的配置信息.打开这个文件,将你的信息填入,具体如下:
client_ID = (你申请应用的appkey)
client_SERCRET =(你申请应用的app_secret)
redirect_URI =(回调地址,跟网上配置的一致,本人比较穷,而且用的是客户端,所以这里就为空)
(2)将代码:
BareBonesBrowserLaunch.openURL(oauth.authorize("code",args[1],args[2]));
System.out.println(oauth.authorize("code",args[1],args[2]));
修改成:
BareBonesBrowserLaunch.openURL(oauth.authorize("code","",""));
System.out.println(oauth.authorize("code","",""));
(3)运行OAUTH4CODE类,获取code,即用户授权登陆后,地址栏上出现的code。
输入刚刚获得的code值,点击回车。通过获取的code,换取accessToken,完成授权认证。
本文主要是弄清楚和总结一下认证的流程。
参考文章:
(1)http://www.cnblogs.com/neutra/archive/2012/07/26/2609300.html
(2)http://rsj217.diandian.com/post/2013-04-17/40050093587