[转载]新浪微博OAuth认证总结 – 梁星的专栏 – 博客园.
自从最近Twitter只支持OAuth认证方式以来,各大应用都纷纷转向OAuth认证方式,而新浪微博的开放平台也将在近日停止Base OAuth的认证方式。
为了能够继续使用新浪微博的开放平台,开始研究OAuth的认证方式,经过一段时间的实践,对于新浪微博开放平台的OAuth认证方式,有一定的经验。鉴 于网上对于这个平台的OAuth相关资料比较少,因此在此分享一下过程中积累的经验,希望可以帮助到一些要使用OAuth认证调用新浪微博接口的人~~
1.关于OAuth:
OAUth认证方式比于Base OAuth的认证方式最大的特点是,应用方并不需要保存用户的帐户与密码,只需要保存经过用户授权的Key与Secret组合即可对于平台上的所有接口资 源进行访问,在传输过程中也可以避免被不怀好意的人通过截包分析的方式获取到用户的帐号与密码。(有一说Twitter全面改用OAuth认证方式的原因 就是防止GFW通过截包获取到一些相关名人的帐号和密码)。具体的一些定义可以详细阅读OAuth的规范定义:OAuth规范。
2.新浪微博开放平台:
新浪微博的开放平台基本上的接口,参数,返回格式都参考了Twitter的模式。当然,国内的另外一些开放平台都大量参考了Twitter的模式,因此基本上大同小异。要使用新浪微博的开放平台,当然必须先到它的网站上面进行注册:新浪微博API。
注册之后,会得到Consumer Key 与 Consumer Secret这两个关键的字段,好好保存下来吧。
新浪微博的这个开发平台上面有充分的文档,能够很快的上手调用这些接口,除了个别较为难办的接口,我们下面再讨论。
3.对新浪使用OAuth:
使用OAuth,必须先让用户进行授权,一般来说授权的过程如下:
(1)由应用向新浪开发平台发出请求,获得未授权的Request Token与Request Secret,这个时候Request Secret暂时用不到,好好保存下来。
(2)将上一步获得的Request Token作为参数,引导用户浏览器跳至新浪微博的授权页面,用户进入这个页面登录新浪微博,进行Token的授权。如果在(1)中已经向服务器设置了浏览器的回调地址的话,则用户的浏览器将会被重定向至该地址,该地址将会新增一个参数:oauth_verifier,这个参数将在后面用到,好好保存。
(3)OAuth认证过程的最后一步,向服务器请求真正的 Token,将(1)中得到的Request Token,Request Secret和(2)中得到的oauth_verifier作为参数,传递给新浪微博服务器,服务器将会返回真正的Access Token与Access Secret,新浪微博还会返回用户在新浪微博中的userid。有了用户的Access Token与Access Secret就可以自由便利地调用新浪微博的开放接口了。
每个调用中,都必须带有OAuth的认证信息,作为OAuth的认证信息,基本上有两种方法可以加入到请求包中:
(1)最推荐的方法,采用HTTP的Authorization Header,这个头部的定义在RFC2617里面有相关定义。
例如:
Authorization: OAuth realm= "http://photos.example.net/" , |
oauth_consumer_key= "dpf43f3p2l4k3l03" , |
oauth_token= "nnch734d00sl2jdk" , |
oauth_signature_method= "HMAC-SHA1" , |
oauth_signature= "tR3%2BTy81lMeYAr%2FFid0kMTYa%2FWM%3D" , |
oauth_timestamp= "1191242096" , oauth_nonce= "kllo9940pd9333jh" , |
oauth_version= "1.0" |
(2)或者可以采用,参数传递的方式,将OAuth的参数与正常的参数一样放置
与Get的URL中,或者POST的包体内容中,都是可以的,
但遇到一些特殊情况就较难解决这个问题了。
4.OAuth认证参数解析:
在上面可以看到,一个正常的OAuth认证中,包含以下若干参数:
(1)oauth_consumer_key: 即是注册时,新浪给你的conusmer key,明文传输
(2)oauth_token: 即是用户完成OAuth认证后的Access Token,在进行OAuth
认证第三步的时候,为Request Token,
第一步时不需要这个参数
(3)oauth_signature_method:加密的方法,提供HMAC-SHA1, RSA-SHA1,
PLAINTEXT 几种方法
(4)oauth_signature: 对于全部参数进行加密后的字符串,包括
consumer secret和access secret
(5)oauth_timestamp:发请求的时间戳
(6)oauth_version:可选的参数,基本上置为1.0,否则会出错的。
(7)oauth_nonce:随机的值,防止重复调用
5.上传图片OAuth之痛:
使用上面的方法,基本上可以解决所有的接口调用。但遇到难搞的上传图片这样的请求时,
就需要一些方法取巧了。
新浪微博的开放平台,要求上传图片时必须使用multipart/form-data的方式进行上传,但OAuth协议在定义时,描述Content-Type为
application/x-www-form-urlencoded, 而并没有提及如何在multipart/form-data使用。
在网上基本上找不到任何一个地方有提及在新浪微博的开放平台上以OAuth的方式上传图片,
经过一个晚上的尝试与借鉴Twitter上的做法后,
终于发现了解决方法。
基本上,在协议上没有说明的内容,就必须由民间采用较为直观的方式进行解决。要在新浪
微博的接口中进行图片上传,必须使用multipart/
form-data作为Content-Type,而OAuth的认证参数不能放入form-data中,必须使用 Authorization Header来处理,而这时,必须将除了文
件的参数,在这个接口中为status加入到oauth的加密中,但并不出现在Authorization Header中,而是后续加入到fom-data中,这样就能够
正常的上传图片并发表微博了。通过这个简单而麻烦的方法,终于能够安全地上传图片到新浪 微博。
6.最后
至此,本人已成功调用新浪微博绝大多数的接口,并开始将应用覆盖搜狐微博,网易
微博等开放平台,希望可以通过这篇文章,记录下一些经
验与教训。
7.参考资料
[RFC5849] E. Hammer-Lahav, Ed. “The OAuth 1.0 Protocol”,RFC5849
[RFC1867] E. Nebel,L. Masinter,“Form-based File Upload in HTML”,RFC1867
[RFC2616] Fielding,R.,Gettys,J,e “Hypertext Transfer Protocol — HTTP/1.1” , RFC2616
[RFC2617] Franks,J.“HTTP Authentication: Basic and Digest Access Authentication”, RFC2617