使用新浪微博开放平台api同步微博内容至自己网站(1.:OAUth认证方式比于BaseOAuthOAuth的认证资料比较少 )
优采云 发布时间: 2022-01-01 20:20使用新浪微博开放平台api同步微博内容至自己网站(1.:OAUth认证方式比于BaseOAuthOAuth的认证资料比较少
)
由于 Twitter 近期只支持 OAuth 认证方式,各大应用纷纷转向 OAuth 认证方式,新浪微博开放平台也将在近期停止 Base OAuth 认证方式。
为了继续使用新浪微博的开放平台,我开始研究OAuth认证方式。经过一段时间的实践,对新浪微博开放平台的OAuth认证方式有了一定的体会。鉴于网上关于这个平台的OAuth相关资料比较少,在此分享一下过程中积累的经验。希望对一些想使用OAuth认证的人调用新浪微博界面有所帮助~~
1.关于 OAuth:
OAUth认证方式相比Base OAuth认证方式最大的特点是应用端不需要保存用户的账号和密码,只需要用户授权的Key和Secret组合即可平台上的接口资源进行访问,在传输过程中,也可以通过截包分析,防止恶意人员获取用户的账号和密码。 (有一种说法,推特之所以完全切换到OAuth认证,是为了防止GFW通过截包的方式获取一些相关名人的账号和密码)。具体定义可以阅读OAuth规范定义:OAuth规范。
2.新浪微博开放平台:
新浪微博开放平台的基本界面、参数、返回格式参考推特模型。当然,国内其他一些开放平台也大量借鉴了推特的模式,所以基本一致。要使用新浪微博的开放平台,当然首先要到其网站注册:新浪微博API。
注册后会得到Consumer Key和Consumer Secret两个关键字段。保存它们。
新浪微博的开发平台有足够的文档,可以快速调用这些接口。除了一些困难的接口,我们将在下面讨论。
3.在新浪使用 OAuth:
要使用 OAuth,用户必须先获得授权。一般来说,授权流程如下:
(1)应用向新浪开发平台发送请求,获取未授权的Request Token和Request Secret。此时Request Secret暂时不用,请妥善保管。
(2)以上一步获取的Request Token为参数,引导用户浏览器跳转到新浪微博授权页面,用户进入该页面登录新浪微博进行授权Token。如果在() 作为参数,传递给新浪微博服务器,服务器会返回真实的Access Token和Access Secret,新浪微博也会返回用户在新浪微博的userid,有了用户的Access Token和Access Secret,你可以自由方便地调用新浪微博的开放界面。
每次调用都必须收录 OAuth 身份验证信息。作为OAuth认证信息,添加到请求包中基本上有两种方式:
(1)最推荐的方法是使用HTTP Authorization Header。这个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认证中,包含以下若干参数:<br />
(1)oauth_consumer_key: 即是注册时,新浪给你的conusmer key,明文传输<br />
(2)oauth_token: 即是用户完成OAuth认证后的Access Token,在进行OAuth认证第三步的时候,为Request Token,
第一步时不需要这个参数
(3)oauth_signature_method:加密的方法,提供HMAC-SHA1, RSA-SHA1, PLAINTEXT 几种方法<br />
(4)oauth_signature: 对于全部参数进行加密后的字符串,包括consumer secret和access secret<br />
(5)oauth_timestamp:发请求的时间戳<br />
(6)oauth_version:可选的参数,基本上置为1.0,否则会出错的。<br />
(7)oauth_nonce:随机的值,防止重复调用<br />
5.上传图片OAuth之痛:
使用上面的方法,基本上可以解决所有的接口调用。但遇到难搞的上传图片这样的请求时,就需要一些方法取巧了。<br />
新浪微博的开放平台,要求上传图片时必须使用multipart/form-data的方式进行上传,但OAuth协议在定义时,描述Content-Type为
application/x-www-form-urlencoded, 而并没有提及如何在multipart/form-data使用。<br />
在网上基本上找不到任何一个地方有提及在新浪微博的开放平台上以OAuth的方式上传图片,经过一个晚上的尝试与借鉴Twitter上的做法后,
终于发现了解决方法。
基本上,在协议上没有说明的内容,就必须由民间采用较为直观的方式进行解决。要在新浪微博的接口中进行图片上传,必须使用multipart/
form-data作为Content-Type,而OAuth的认证参数不能放入form-data的参数中,必须使用Authorization Header来认证,而这时,必须将除了文
件(file)的参数,就是将status这个参数加入到oauth的BaseString中进行加密,再将status作为fom-data的一个value中,这样就能够
正常的上传图片并发表微博了。通过这个简单而麻烦的方法,终于能够安全地上传图片到新浪微博。
6.最后
至此,本人已成功调用新浪微博绝大多数的接口,并开始将应用覆盖搜狐微博,网易微博等开放平台,希望可以通过这篇文章,记录下一些经
验与教训。<br />
<br />
7.参考资料
[RFC5849]E。哈默拉哈夫,埃德。 “OAuth 1.0 协议”,RFC5849
[RFC1867] E. Nebel,L. Masinter,“HTML 中基于表单的文件上传”,RFC1867
[RFC2616] Fielding,R.,Gettys,J,e "超文本传输协议 - HTTP/1.1", RFC2616
[RFC2617] Franks,J.“HTTP 身份验证:基本和摘要式访问身份验证”,RFC2617
新浪微博开放平台: