[05.24] 利用Callback=xml 绕过OAuth 验证,免去xAuth的申请

以前一直用 BasicAuth 作验证,不过 Sina 声明从六月份开始正式停止对 BasicAuth 的支持,因为保密性能太差,的确,谁也不希望自己的用户名和密码一直在天上飘来飘去,被拦截已经不是时间问题,而是必然的了。

然而 Oauth 对我们这种小型爱好者有一个问题就是需要到网页端去点击那个确认授权,可是我们是可以让用户在软件内输入用户名密码的。虽然这样还是会让我(也就是第三方软件提供方)直接接触到用户的用户名密码,但是我个人认为作为客户端可能这样是无可避免的,这也牵涉到一个用户信任度的问题,不然难道 Sina 要直接提供在线 TextBox 输入功能么。。。

不要偏题,本文重点不在OAuth的验证过程,那么接下来简单说明下 OAuth 的流程:

1.第三方服务商用自己的 key 和 secret 向服务器发起申请,获得 request token 这个 token 和用户没有任何关联,仅仅是服务商和 sina 沟通的结果;

2.第三方服务商根据 request token 将用户导向 Sina 提供的授权页面,一个 Web 页面(这个是重点,我们就是要绕过这一步,没人愿意在自己的软件里面转为Oauth验证添加一个 WebBrowser Control);

3.用户在 Web 页面中输入了用户名密码并授权后,页面执行 Callback,callback 的地址已经包含了一个 oauth verifier,可以看做用户授权证书;

4.第三方服务商带着第一步获取的 request token 和 第三步获取的 verifier 再次向 Sina 服务器发起申请,现在你将获得一个 access token,也就是通行证了。

 

好阐述完毕 oAuth 的验证过程后,我们发现移动客户端中如果不借助 Basic Auth 和 xAuth(复杂的申请流程),很难在无页面导向的情况下获得 access token,网上查阅了很多资料,Android 就是使用了一个 webview 控件,其他平台要么就是申请 xAuth 要么就是网页形式,他们忽略了 Sina 很人性化的一个 callback = json/xml 的功能。

 

详细说明下这个问题,第三步中,如果我们直接以sina 的页面导向形式 request 需要的 uri (类似 http://api.t.sina.com.cn/oauth/authorize?oauth_token={0}&oauth_callback={1})那么你获得的 response 肯定是一个 html 的页面。但是,Sina 的 authority API 提供了一个很tricky的功能(http://open.t.sina.com.cn/wiki/index.php/Oauth/authorize?retcode=0

 

简单说,如果你用(http://api.t.sina.com.cn/oauth/authorize?oauth_token={0}&oauth_callback=xml&userId={1}&passwd={2})这个 Path 去 request Sina 的服务器,神奇的事情就发生了,返回会直接是一个 xml 格式的 callback,其中包含 token 和 verifier,接下来的事情就跟上面第四步一样咯,嘿嘿,绕过页面的感觉是不是很爽,不知道 Sina 会不会取消这样的 callback 因为毕竟这样还是会有一次需要用 userid 和 passwd 作为参数传递出去的,等于还是裸奔了一段。大家自己判断吧。(json 方式大概相同,就不说了。)

posted @ 2011-05-24 17:28  akita  阅读(2185)  评论(13编辑  收藏  举报