Tumblr API Photo Post返回401(未授权)

时间:2014-01-04 23:00:52

标签: java android api tumblr scribe

我正在尝试在Android应用中使用Tumblr API来授权用户并制作文字和照片信息。我正在使用Scribe库。因此,我可以成功获取访问令牌并使用它来获取用户信息。我也可以毫无问题地发帖。这告诉我,我正在正确签署请求。

但是,我花了最后一周半的时间试图制作照片,但没有成功。我不断收到401错误(未经授权)我已阅读Tumblr支持论坛以及Stack Overflow上的许多帖子,但无法找到解决方案。

我不愿意包含Jumblr库,因为我试图让我的应用程序尽可能精简。也就是说,我查看了Jumblr代码并决定模仿照片帖子的发送方式(https://github.com/tumblr/jumblr/blob/master/src/main/java/com/tumblr/jumblr/request/MultipartConverter.java)。我仍然收到完全相同的错误。

下面是我的多部分POST请求和我收到的响应的示例。我已经替换了博客名称,OAuth签名,消费者密钥和令牌变量,并且为了简洁起见已删除了二进制图像数据。其他一切都没有动过。我有几个问题......

  1. 是否还应包含其他变量 多部分? Stack Overflow用户说放置了 “oauth_”中的签名变量解决了他的问题。我没有 取得了成功,但也许有一些我不知道的事情。

  2. Jumblr应用似乎没有对图像数据进行任何编码, 虽然Tumblr文档声明它应该是URL 编码。现在我正在发送它,因为Jumblr应用程序似乎(原始 二进制)。这是对的吗?

  3. 我的请求中还有其他内容 不正确的?

  4. 请求:

    注意:我了解到应该在没有多部分表单的情况下生成OAuth签名。我的代码在构建此请求时会考虑到这一点!

    POST http://api.tumblr.com/v2/blog/**REMOVED**.tumblr.com/post HTTP/1.1
    Content-Type: multipart/form-data, boundary=cbe6b79db1b3cbe6b79e104e
    Authorization: OAuth oauth_signature="**REMOVED**", oauth_version="1.0", oauth_nonce="3181201716", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="**REMOVED**", oauth_timestamp="1388791537", oauth_token="**REMOVED**"
    Content-Length: 1001
    User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.3; SM-N900T Build/JSS15J)
    Host: api.tumblr.com
    Connection: Keep-Alive
    Accept-Encoding: gzip
    
    --cbe6b79db1b3cbe6b79e104e
    Content-Disposition: form-data; name="type"
    
    photo
    --cbe6b79db1b3cbe6b79e104e
    Content-Disposition: form-data; name="caption"
    
    Another pic test...
    --cbe6b79db1b3cbe6b79e104e
    Content-Disposition: form-data; name="data[0]"; filename="postr_media_file_1388791537-1709648435.jpg"
    Content-Type: image/jpeg
    
    ---- BINARY DATA REMOVED FOR BREVITY ----
    

    响应:

    HTTP/1.1 401 Not Authorized
    Server: nginx
    Date: Fri, 03 Jan 2014 23:25:39 GMT
    Content-Type: application/json; charset=utf-8
    Transfer-Encoding: chunked
    Connection: close
    Set-Cookie: tmgioct=52c746f34266840643527780; expires=Mon, 01-Jan-2024 23:25:39 GMT; path=/; httponly
    P3P: CP="ALL ADM DEV PSAi COM OUR OTRo STP IND ONL"
    
    3c
    {"meta":{"status":401,"msg":"Not Authorized"},"response":[]}
    

1 个答案:

答案 0 :(得分:2)

" Tumblr API讨论"

posted the answer谷歌集团。这就是我所做的:

正确执行此操作的关键是 NOT ,只需在没有多部分表单的情况下进行签名!以下是步骤......

  1. 将所有字段添加到数据字段之外,作为常规网址编码POST 身体变量
  2. 签署请求
  3. 删除刚刚从请求中添加的帖子变量的所有内容
  4. 添加多部分表单,包括此次的数据字段
  5. 要考虑的一些事情......

    • 标题中的 Content-Type 应为" multipart / form-data"
    • 所有表单部分的 Content-Disposition 应为" form-data"当然,还包括一个有效的"名称"属性(即类型,标题等......)
    • 数据部分的 Content-Disposition 还应包含"文件名"属性
    • 应该包含Content-Type的唯一表单部分是数据,它应该设置为您正在上传的文件的mime类型(即" image / jpeg")
    • 我使用"数据[0]"作为数据字段的名称。我还没有使用"数据"来测试这个,但根据我所读过的一切,它也应该以这种方式工作。如果您要创建照片集,我相信您可以简单地添加其他部分(即数据1。数据[2]等...)。再说一次,除了"数据[0]和#34;我还没有测试过任何东西,所以尽职尽责!
    • 我做了 NOT 编码二进制图像数据!!!在将图像添加为POST主体变量时,我看到人们在其他帖子中花费了相当多的时间。如果以多部分形式执行此操作,则可以跳过编码并发送原始二进制数据! ; - )

    我希望这有助于某人!我花了两个星期的时间将头撞在随意的固体物体上,试图解决这个问题。实现非常简单,但没有关于如何正确构建POST请求的文档。官方文档真的应该包括那个。如果我知道我上面发布的内容,我可以在几分钟而不是几周内完成!

    我之前发布的最后一个请求仍然有效,但这里又是。记住我提到的关于签名的内容!!!

    请求:

    POST http://api.tumblr.com/v2/blog/REMOVED.tumblr.com/post HTTP/1.1
    Content-Type: multipart/form-data, boundary=c60f7c041c02c60f7c046e9b
    Authorization: OAuth oauth_signature="***REMOVED***", oauth_version="1.0", oauth_nonce="315351812", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="***REMOVED***", oauth_timestamp="1388785116", oauth_token="***REMOVED***"
    Content-Length: 1001
    User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.3; SM-N900T Build/JSS15J)
    Host: api.tumblr.com
    Connection: Keep-Alive
    Accept-Encoding: gzip
    
    --c60f7c041c02c60f7c046e9b
    Content-Disposition: form-data; name="type"
    
    photo
    --c60f7c041c02c60f7c046e9b
    Content-Disposition: form-data; name="caption"
    
    Another pic test...
    --c60f7c041c02c60f7c046e9b
    Content-Disposition: form-data; name="data[0]"; filename="postr_media_file_1388785116-1709648435.jpg"
    Content-Type: image/jpeg
    
    ***** BINARY DATA REMOVED FOR BREVITY *****
    --c60f7c041c02c60f7c046e9b--