新浪微博很火,开放平台很火,开发者很“火”。
开发者火是因为新浪微博开放平台对开发者很不友好,其 API 从实现到文档都很粗糙。
API 实现不标准还能忍,但是文档不说明清楚,要开发者自己摸索就离谱了。看来新浪尚未有暇顾及第三方开发者,开放平台现在也只是“开门放出来”而已。结果就是开发者在很多毫无意义的事情上折腾,浪费时间!
我写这一系列文章的目的就是避免后来者遭同样的罪。
这是第一篇,关于 upload API 的 OAuth 验证失败问题。去论坛搜索一下 upload 就知道有多少人深受其害了。
Upload API 的 OAuth 之所以难搞,部分是因为其 HTTP 请求格式的特殊性,主要是因为新浪微博那匪夷所思的实现。
Upload API 的特殊性在于其请求“采用 multipart/form-data 编码方式提交”。根据 OAuth 1.0 协议,Content-Type 为 multipart/form-data 的 HTTP 请求,其 entity body 不参与 OAuth 签名。照此,upload API 的 OAuth 应该比其他普通 API 更简单,因为只有 OAuth 参数(oauth_ 开头的一系列特别参数)参与签名。所以,标准的 Signature Base String 应该是:
POSThttp%3A%2F%2Fapi.t.sina.com.cn%2Fstatuses%2Fupload.jsonoauth_consumer_key%3Dxxxxxxxxxx%26oauth_nonce%3D15492994958798014939%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1312912324%26oauth_token%3Dyyyyyyyyyy%26oauth_version%3D1.0
与其对应的标准的 Authorization header 应该是:
OAuth oauth_consumer_key=xxxxxxxxxx, oauth_token=yyyyyyyyyy, oauth_signature_method=HMAC-SHA1, oauth_version=1.0, oauth_nonce=15492994958798014939, oauth_timestamp=1312912324, oauth_signature=2RxNudXqdeSLXSxxRSgpIWUa3HI%3D”
然而,迎接你的将是:
40107:Oauth Error: signature_invalid!
这是因为新浪微博 upload API 的实现要求 Signature Base String 包含除 pic 以外的参数。所以新浪微博需要的 Signature Base String 是这样的:
POSThttp%3A%2F%2Fapi.t.sina.com.cn%2Fstatuses%2Fupload.json
lat%3D37.78711200
%26
long%3D-122.40846000
%26oauth_consumer_key%3Dxxxxxxxxxx%26oauth_nonce%3D18218585476538551879%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1312912886%26oauth_token%3Dyyyyyyyyyy%26oauth_version%3D1.0%26
status%3DPic
问题来了:status、lat、long 这些参数是在 entity body 中提交的,如前所述,它们不参与 OAuth 签名。为了遵循 OAuth 协议,必须将这些参数加入 URL query string 或 Authorization header。
规范的开发者这么做了,结果“错”了,新浪微博 server 还是返回:
40107:Oauth Error: signature_invalid!
事实上,无论你怎么折腾,只要你遵循 OAuth 协议,你一定折腾不出来,因为新浪微博是不遵循 OAuth 协议的。
对于 Content-Type 为 multipart/form-data 的 HTTP 请求,新浪微博要求非 binary 参数(如 upload API 中的 pic 参数)参与 OAuth 签名,同时还要求这些参数是“无由来”的。也就是说,Signature Base String 要包含这些参数,但这些参数不能出现在 URL query string 或 Authorization header。这意味着新浪微博 server 端接收到请求后从 entity body 中提取了这些参数来进行 OAuth 签名验证。再强调一遍,对于 Content-Type 为 multipart/form-data 的 HTTP 请求,这是违反 OAuth 协议的。但在新浪微博上,我们就要是要违反 OAuth 协议才能通过 OAuth 验证。
即便不考虑像我这样耗时耗力的摸索过程,新浪微博的这种非标准实现也给开发者带来了很大麻烦,因为这导致了很多遵循 OAuth 协议实现的 OAuth 库无法直接使用。
在折腾的过程中,我还发现了另一个要命的 bug。如果 pic 的 Content-Disposition header 缺少 filename 参数的话,新浪微博也会返回“40107:Oauth Error: signature_invalid!
”,虽然 pic 跟 OAuth 毛关系都没有,虽然根据标准 filename 不是必须的,虽然事实上 filename 在这里是没用的。
最后总结一下搞定新浪微博 upload API 的“正确”方法:
- 所有参数用 multipart/form-data 格式提交,不能出现在 URL query string 或 Authorization header。
- 除 pic 以外的所有参数进入 Signature Base String 参与 OAuth 签名。
- pic 的 Content-Disposition header 必须包含 filename 参数。
分享到:
相关推荐
对不起,我不得不给这个资源挂上分数,因为该死的CSDN非要折腾个这垃圾功能,我要下载别人的东西没积分没办法....这个里面包括代码,我整理的word笔记文档。 只是我觉得这远远不够,过几天我会录制一个视频,因为我...
该死的易受攻击的Web服务是一个该死的易受攻击的不安全API / Web服务。 这是的替代品 此易受攻击的应用程序包含以下API / Web服务漏洞: 不安全的直接对象参考 横向访问控制问题 垂直访问控制问题 批量分配 跨站...
文明VI云端播放(和玩你该死的转弯)Webhook(使用Python FastAPI) 使用Python FastAPI为Civilization VI的“按云或“Webhooks”创建一个webhook端点,并将通知推送到Matrix。 我将接受“拉取请求”以添加其他...
RTFSC, 我们来看看那该死的源代码 # RTFSC阅读该死的源代码在在线网站上查看,如:grepcode, androidxref大牛们是怎么阅读Android系统源码的?阅读ANDROID源码的一些姿势
与该死的超级复杂银联文档说再见,该文档还包含错误。 官方银联在线支付SDK中的许多错误已得到修复。 如果HTTP包被黑客捕获,则来自客户端的所有敏感数据(例如银行卡号和密码)都将由JS API进行RSA加密。 ##...
与该死的超级复杂银联文档说再见,该文档还包含错误。 官方银联在线支付SDK中的许多错误已得到修复。 如果HTTP包被黑客捕获,则来自客户端的所有敏感数据(例如银行卡号和密码)都将由JS API进行RSA加密。 ##...
该死的计算机网络.pkt
heroku-fucking-console, 运行heroku控制台时,我要一个该死的控制台,该死 控制台$ heroku console! `heroku console` has been disabled. Please use `heroku run` to run a console:! https://de
《谎言,该死的谎言或统计数据:如何用统计数据说实话》是一本为本科生设计的免费统计学教科书,作者是科罗拉多州立大学普韦布洛分校的数学与物理学系教授Jonathan A. Poritz。本书旨在教授读者如何正确理解和使用...
7. 创新与市场适应性的关系:盛大选择的创新之路与行业趋势相悖,使得公司在短期内面临困难,但长期来看,坚持创新可能带来更大的突破。 8. 盛大的未来展望:尽管面临挑战,盛大仍在坚持其创新策略,并且已经在版权...
很抱歉,但根据您提供的信息,"你这该死的温柔.doc"似乎是一个文档的标题,描述也与标题相同,且标签为"范文"。然而,文档内容展示的是一段歌词,包含中文和英文的Rap部分,讲述了爱情中的失落和痛苦。这部分内容并...
标题和描述中提到的"初中语文文摘社会该死统计数字"主要反映了统计数字在社会生活中被运用和可能产生的误导性。文章通过两个生动的例子,揭示了统计在实际操作中的不准确性及其背后的动机。 首先,文章提及的小学...
尽管描述较为模糊,我们可以从“新信号”和“旧的”这两个词汇推测,这可能关于某个API的变化或者语言新特性的使用。 首先,让我们深入了解一下JavaScript的基础。JavaScript是由Brendan Eich在1995年为 Netscape ...
初中语文文摘社会“该死”的柔术
科学不应该为了吸吮而吸吮,因此,该死的尝试使该过程中的吸吮部分吸得少一点。 基本用法 用Bioconda安装该死的。 conda create -n dammit-env python=3 dammit conda activate dammit-env 下载并安装数据库的子集...
这个该死的漂亮的GIFZ真的还不错 找是两人的浪费的两个房间广佛结果 的反对
REST API SQL注入 相同来源方法执行 JSON Web令牌(JWT)密钥暴力破解 跨域资源共享 指示 DVWS可以与XAMPP设置一起使用。 XAMPP是一个免费的开源跨平台Web服务器解决方案,主要由Apache Web Server和MySQL数据库组成...
《EscapePod: 该死的该死的》是一款基于虚幻引擎4开发的游戏项目,名为“pod22”。虚幻引擎4(Unreal Engine 4,简称UE4)是由 Epic Games 开发的一款强大的游戏开发引擎,广泛应用于制作高质量的3D游戏、虚拟现实...
Python,这个被戏称为“什么该死的蟒蛇”的编程语言,其实是一个强大而易学的工具,尤其在数据处理、Web开发、自动化任务以及科学计算等领域有着广泛的应用。Python的简洁语法使得它成为初学者入门编程的理想选择,...
丢下该死的星星 样本数据: { "_id" : "57a9966fb93db11e9fba512a" , "lectures" : [ { "hours" : [ "08:40" , "09:30" ] , "status" : "[S]" , "building" : "EA" , "day" : "Mon" , "l