Twitter全面改用OAuth认证新浪微博接口的人~~
优采云 发布时间: 2021-06-06 20:12Twitter全面改用OAuth认证新浪微博接口的人~~
由于 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授权.如果你在(1)如果浏览器的回调地址已经设置到服务器中,用户的浏览器会被重定向到这个地址,并且会在地址中增加一个新的参数:oauth_verifier。这个参数会稍后使用并保存。
(3)OAuth是认证过程的最后一步,向服务器请求真实的Token,将(1))中得到的Request Token、Request Secret和oauth_verifier作为参数传递给新浪微博服务器,服务端会返回真实的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的body内容中,都是可以的,
但是,在某些特殊情况下,解决这个问题会比较困难。
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:所有参数的加密字符串,包括消费者秘密和访问秘密
(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进行处理。这时候就必须除了file参数之外,在这个界面,status是加到oauth的加密里面的,但是没有出现在Authorization Header里面,而是后面加到了fom-data中,这样图片可以正常上传,可以发布微博。通过这个简单又麻烦的方法,我终于可以安全的上传图片到新浪微博了。
6.last
到目前为止,我已经成功调用了新浪微博的大部分接口,并开始覆盖搜狐微博、网易微博等开放平台。希望可以通过这个文章记录一些经验和教训。
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
新浪微博开放平台: