[转载]快速开发新浪微博的firefox插件(下)

[转载]快速开发新浪微博的firefox插件(下) – Fei He – 博客园.

上篇主要讲了讲firefox插件的机制,接着我们来看快速开发一个firefox插件中我面临的第二个问题—-Oauth授权(开始开发的时候只是想着快速开发完成,当然授权这块最快的方案自然就是basic auth,但是新浪微博6月1号以后就不支持basic auth了。)。

Oauth的官网上说是这样描述它的用途:

An open protocol to allow secure API authorization in a simpleand standard method from desktop and web applications.

在Oauth的官网上对Oauth有详尽的描述以及不用语言对于Oauth的实现,对于我的开发我需要了解的其实非常简单.

首先对于Oauth有三个url是必须了解的:

  • Request Token URL
  • User Authorize URL
  • Access Token URL

另外,我们还需要了解针对这些URL相应的一些参数:

  • oauth_consumer_key
  • oauth_consumer_secret
  • oauth_signature_method
  • oauth_signature
  • oauth_timestamp
  • oauth_nonce
  • oauth_version

具体这些URL和参数有什么作用呢?我们结合新浪微博来说。对于开发一个新浪微博的应用,你必须在新浪微博申请一个app key和app key secret, 有了它们我们就可以开始了。新浪的Oauth是这样一个流程:

  1. 第 一次你需要做的是Request Token URL,对于新浪微博就是http://api.t.sina.com.cn/oauth/request_token。接着就是请求的参数了,这个时候 你需要把你申请的app key作为oauth_consumer_key, 而把你的app key secret作为oatu_consumer_secret。oauth_signature_method就是你的加密算法,oauth支持 HMAC-SHA1, RSA-SHA1, PLAINTEXT这三种算法,而新浪微博指定需要HMAC-SHA1,所以对与oauth_signature_method我们这里就是HMAC- SHA1了。oauth_timestamp就是请求的时间戳,这个时间戳的范围是现在1970 00:00:00 GMT的秒数,而且每次请求的时间戳必须大于上次的。oauth_nonce就是随机生成的一个字符串,就是为了防止重复请求。 oauth_version现在只能是1.0。最后我们需要对所有参数使用oauth_signature_method指定的加密算法加密作为 oauth_signature。对于请求的参数,我们有两种绑定方式:Get: 拼URL;Post: 放在Http heads里。 有了URL和参数我们就可以发起我们的请求。当新浪微博接受我们的请求检查合法后,会返回给我们一个未授权的oauth_token和 oauth_token_secret,因为我们还没有获得用户的授权。
  2. 有 了上一步的请求返回的oauth_token和oauth_token_secret,在进行下一步请求之前我们需要根据我们应用的类型决定我们下一步的 策略。如果我们是一个web应用,我们有自己的域名我们就可以选择使用callback_url的方式,但是我要做得是一个firefox插件这种方式显 然不合适,那么我只有选择使用verify PIN的方式了。确定了这个,我们请求User Authorize URL(对于新浪微博就是http://api.t.sina.com.cn/oauth/authorize)。这次的参数和上次的参数还是有一些小小 的差别的:首先,我们这次需要用上次请求返回的oauth_token作为oauth_consumer_key, 使用返回的 oauth_token_secret作为oauth_consumer_secret,oauth_signature_method不 变,oauth_timestamp根据这次请求的时间重新生成,oauth_nonce重新生成,oauth_version不变,而 oauth_signature根据这次的参数生成。在User Authorize过程中,我们要加一个参数callback_url。因为我们采用verify PIN的方式,所以这个参数我可以指定为xml。因为这一步就用户授权,那么我们自然还是要输入我们需要访问的新浪微博账号的用户名和密码,分别作为 userId, passwd。新浪微博接收到我们的User Authorize请求检查合法后,会以xml格式返回给我们一个oauth_verifier,证明我们的应用获得了用户的授权。
  3. 有 了oauth_verifier, 加上我们第一步获得oauth_token和oauth_token_secret,其他参数还是按照前面的规则(这次不需要 oauth_callback)构成我们的参数,我们来请求Access Token URL(对于新浪微博就是http://api.t.sina.com.cn/oauth/access_token)。 这一次新浪微博会返回access_token和access_token_secret, 我们授权就通过了。而这个access_token和access_token_secret当我们以后请求新浪微博API时,会作为 oauth_consumer_key和oauth_consumer_secret出现。比如我们要发送微博,新浪微博发送微博的API是 http://api.t.sina.com.cn/statuses/update.json。这时我们还是按照前面的规则组织参数(以 access_token作为oauth_consumer_key, access_token_secret作为oauth_consumer_secret),同时加上参数status,值为我们需要发送的内容就OK 了。

到这一步,我们还不算完,因为我们需要在 firefox的插件中调用新浪微博的oauth。我们都知道JavaScript直接调用新浪微博的API是跨域请求,这是不被允许的。而我们通常解决 跨域请求的方式主要就是:Jsonp, flash,iframe。这里面我们唯一可以尝试是jsonp,而jsonp是需要server端也就是新浪微 博配合的,而实际上新浪微博是不支持jsonp的。那是不是我们没有办法了呢?

@mozilla.org/xmlextras/xmlhttprequest;1

查看了MDN的文档,发现firefox自己的Xmlhttprequest可以,而且可以指定同步还是移步,然后在callback方法里解析返回参数。具体如何实现MDN。

ps:这个插件的代码是作为一个其他应用的一部分,这涉及其他人的劳动,有兴趣可以发站内信或邮件我会单独发一份(只包含firefox插件部分)给你。

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏