我有一个iOS应用程序将图像发布到多个服务,包括twitter,我正在尝试将该支持扩展到tumblr。我已经为OAuth 1.0a标头逻辑调整了一些开源代码,并且它的工作状态足以成功实现twitter + twitpic和tumblr的身份验证。但是,tumblr的图片发布失败,状态为401,字符串响应为“无效的OAuth凭据”
为了简化,我唯一的多部分部分是帖子类型和图像数据。
所以我的简单POST是http://www.tumblr.com/api/write,签名基本字符串是(粗略地说,因为我已经编辑了我的消费者密钥和令牌,并添加了换行符以便于阅读):
POST&http%3A%2F%2Fwww.tumblr.com%2Fapi%2Fwrite&
oauth_consumer_key%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%26
oauth_nonce%3D71edd7a1224463a7e1723bb7b568060b4d69deb6%26
oauth_signature_method%3DHMAC-SHA1%26
oauth_timestamp%3D1297678418%26
oauth_token%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%26
oauth_version%3D1.0%26
type%3Dphoto
我的oauth标题是(为了便于阅读,再次添加了换行符):
Authorization: OAuth realm="http://www.tumblr.com/",
oauth_consumer_key="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1296445530",
oauth_nonce="71edd7a1224463a7e1723bb7b568060b4d69deb6",
oauth_version="1.0",
oauth_token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
oauth_signature="fWuli4eO3qVehfdeFzZN%2FDNYpFk%3D"
我添加的唯一其他标题是Content-Type(multipart / form-data)& Content-Length和消息正文只是:
--my_sorta_unique_boundary_string
Content-Disposition: form-data; name="type"
photo
--my_sorta_unique_boundary_string
Content-Disposition: form-data; name="data"
Content-Type: image/jpg
Content-Transfer-Encoding: binary
... (image data) ...
--my_sorta_unique_boundary_string--
任何人都可以告诉我,如果我的签名基本字符串或auth标题出错了,或者是否有一些让tumblr oauth帖子工作的技巧?
答案 0 :(得分:2)
我在Silverlight中实现了与OAuth实现完全相同的问题 - 我已经实现了API的其余部分而没有任何问题,如果您不使用OAuth并且只是发送电子邮件/密码标头,则此方法也有效。 / p>
Arvin的帖子只是向我展示了这个问题,他在其OAuth中包含了其他非文件字段。我刚刚对我的帖子做了同样的事情,所以他们是多部分形式的身体,但也被添加到OAuth sig - 现在我上传照片帖子没有问题!
答案 1 :(得分:1)
我刚刚在向Tumblr发布照片条目时,我的应用程序正在生成的基本字符串转储。添加了航线以减少默默无闻。希望它有所帮助。
POST&http%3A%2F%2Fwww.tumblr.com%2Fapi%2Fwrite&
caption%3D%253Cp%253Etesting%253C%252Fp%253E%26
click-through-url%3D%26
format%3Dhtml%26
generator%3D%253C%2520href%253D%2522http%253A%252F%252Fsudocode.net%252Fprojects%252Fpicasa-2-tumblr%2522%253EPicasa2Tumblr%253C%252Fa%253E%26
group%3Darvn.tumblr.com%26
oauth_consumer_key%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%26
oauth_nonce%3Db0f187f5d0781b3d6aea0f192e116524%26
oauth_signature_method%3DHMAC-SHA1%26
oauth_timestamp%3D1296560370%26
oauth_token%3DwkR9Jjtnp0tMPHp3aqcxvRd401cUeVX7PzxUrc0Y8SZZRoLHgs%26
oauth_version%3D1.0%26
private%3D0%26
slug%3D%26
state%3Ddraft%26
tags%3D%26
type%3Dphoto
有一点,您没有通知Tumblr您将使用类型参数发布照片。
答案 2 :(得分:0)
我遇到了同样的问题。这是因为我的一个空白的Tumblr秘密。
这是你得到它的地方: http://www.tumblr.com/oauth/apps - > “显示密钥”
另外,我正在使用带有https://www.tumblr.com/oauth/access_token网址的xAuth内容。
我希望这会有所帮助。我正在使用Devise gem登录Rails。
答案 3 :(得分:0)
有同样的问题:我使用的OAuth库(GTM OAuth)似乎没有使用POST数据字段进行签名。在我添加字段类型和标题作为查询字符串之后,OAuth库使用了它们,我能够上传照片/帖子/其他。
似乎每个帖子正文字段(二进制数据除外)都需要成为OAuth签名的一部分。