新浪、腾讯微博开放平台非标准oauth解析

由于工作需要,最近开始研究下微博的开放平台,而oauth则是开放平台的公认标准。


标准到了国内,那就不是标准了,各门户的实现实现方式总是有那么一点小小的区别。


现已新浪微博,腾讯微博开发平台为咧,我是基于Scribe来实现oauth授权的 ,Scribe使用灵活,实现外国的主流开放平台都没啥问题。

 别人是按照标准的协议来写的,到了国内总有点水土不服了


oauth授权由三个步骤组成

  1. request_token 获取未授权的Request Token
  2. authorize 请求用户授权Token
  3. access_token 获取授权过的Access Token



腾讯微博:

主要不爽的地方是 oauth协议规定如果是桌面应用或者无回调URL的话 


oauth_callback=oob ,可腾讯微博偏偏是oauth_callback=null,这在Scribe里面里面实现不鸟,需修改源码。


其次有一点要注意的  腾讯微博只支持 query-string认证模式,就是参数全拼接在超链接后面


还好这点在Scribe中得到了支持,只需设置SignatureType即可



新浪微博:

开始使用一切正常,可当我设置oauth_callback的时候,问题就来了,总是无法回调URL而是直接显示出验证码在页面上了,


煞是奇怪。。 经仔细看新浪API后原来,oauth_callback参数是在请求用户授权Token里面,而根据协议是应该放在获取未授权的Request Token里面。


这改动也太大了吧,真不靠谱。 经GOOGLE一番得知,原来这是老oauth 1.0 与 oauth 1.0a的区别。 我之所以说老,是因为 oauth 1.0a已经被被采纳


为了ouath 1.0的标准了。这新浪开发文档里面的Oauth授权说明,那不是纯忽悠吗,跟实际API严重不符啊。


抱着不死心得心态,我下载了新浪官方的SDK,通过SDK开发的应用,在第二步请求用户授权Token中不带oauth_callback是可以返回到


在第一步中获取未授权的Request Token接口中设置的oauth_callback参数URL地址。这件事情很让我无语,也让我纠结了很久,到底是什么原因了。

一步步跟调试SDK代码,看看其中到底有哪些偏差。


在摸索中发现,由于新浪微博支持query-string和http headers 2种认证方式。当我在Scribe使用query-string模式的时候竟然没有半点问题,暂时解决

Scribe不兼容新浪微博的情况。

可是新浪的官方SDK也没有使用query-string,那他到底有哪些神奇之处了。。。 经发现我,真是让我纠结 现跟大家分享


1.通过Scribe 在构建OAuthService的时候,设置oauth_callback 跑程序是没问题的,只是不能返回到回调URL。这说明生成的签名是不存在问题的, 这说明新浪微博有其特别的地方。


2.调试官方的SDK我发现,生成的baseString里面多了一串source而其值跟oauth_consumer_key的值相同,而这是参与签名运算的


3.生成的header里面不带oauth_callback参数,oauth_callback参数只参与签名运算


4.将oauth_callback=xxx&source=key , 一并post提交到oauth/request_token


至此就完成了新浪BT的授权过程。我将这些特例加入到Scribe 中时,成功返回到回调页面。。

新浪你有必要弄成这样不。。。,不想让我们玩就直说嘛,真伤不起。。

哎,敢不敢都按标准来玩啊。。 


其他开发平台尚未研究,估计也好不到哪里去吧。。

猜你喜欢

转载自hezhong002.iteye.com/blog/1166106