3

我正在通过使用 Pocket API 构建 Rails 应用程序来测试 RoR,我必须授权用户。对于 HTTP 请求,我使用https://github.com/rest-client/rest-client库。

第一步,获取请求令牌工作正常:

require 'rest_client'
response = RestClient.post 'https://getpocket.com/v3/oauth/request', :consumer_key => @consumer_key, :redirect_uri => @redirect_uri
@code = response.split("=")[1]

但是我在第二步得到了一个 Bad Request 错误,即使用上面步骤中收到的请求令牌获取访问令牌:

access_token = RestClient.post 'https://getpocket.com/v3/oauth/authorize', :consumer_key => @consumer_key, :code => @code

400 Bad Request 是我在 Ruby 应用程序错误屏幕上得到的。我也尝试了使用 cURL 和 POSTMan Chrome 扩展的相同请求,然后我得到的状态码是:403 Forbidden。我得到的 X 错误代码是 158,它转换为 X 错误消息“用户拒绝代码”。关于 Pocket API 文档: http: //getpocket.com/developer/docs/authentication

由于我尝试了几个不同的通道来测试这个请求并且每次都失败,我猜测问题不在于解析,而是我可能遗漏了一个重要的细节或步骤(可能是 HTTP 请求标头?)。提前感谢您的帮助!

4

2 回答 2

9

原来我(或我们)遗漏了一个重要的细节:

每当在 POSTMan 或其他任何地方测试您对 Pocket API 的请求时,我们自然会跳过访问授权 URL 的过程,其形式为:

https://getpocket.com/auth/authorize?request_token=YOUR_REQUEST_TOKEN&redirect_uri=YOUR_REDIRECT_URI

现在,即使您之前可能允许您的应用程序访问您的帐户,但在每次调用时,Pocket API 都不会在访问此 URL 之前激活请求令牌。只有这样您的请求令牌才会被激活并可以用于第二个身份验证步骤。这样做后效果很好。

作为在 Ruby on Rails 中使用 Pocket API 的任何人的旁注,有一个很好的包装器 gem:https ://github.com/turadg/pocket-ruby

于 2014-12-28T05:42:34.787 回答
2

我可以确认您确实缺少 HTTP 标头,这将导致 Pocket 服务器拒绝您尝试发送的发布请求。

标头可以通过几种方式进行通信:有时它们通过与服务器请求关联的代码/令牌进行通信(这里似乎不是这种情况)。您需要根据您在初始请求中使用 OAuth 执行此操作时使用“授权”标头。

应该对您有所帮助:注意“Content-Type:”标头后面的“Authorization:”标头包含返回的信息。

如需深入阅读,请访问此处

我可能还建议尝试为您完成大部分请求的OAuth2 gem - 它可能会大大简化您正在做的事情!

这是 Postman 上的样子。

于 2014-12-27T00:27:09.500 回答