[来自 OAuth Ruby Google 小组的交叉发布。如果你不能在那里帮助我,请不要担心]
我正在将一个项目与TripIt 的 OAuth API集成, 并且遇到了一个奇怪的问题。
我验证得很好,我可以毫无问题地存储和检索给定用户的令牌/秘密,我什至可以使用 gem 向许多服务发出 GET 请求。但是当我尝试使用我需要 POST 的一项服务时,我收到 401“无效签名”响应。
也许我不明白如何将数据传递给 AccessToken 的 post 方法,所以这是我的代码示例:
xml = <<-XML
<Request>
<Trip>
<start_date>2008-12-09</start_date>
<end_date>2008-12-27</end_date>
<primary_location>New York, NY</primary_location>
</Trip>
</Request>
XML`
response = access_token.post('/v1/create', {:xml => xml},
{'Content-Type' => 'application/x-www-form-urlencoded'})
我已经尝试过,有没有提前转义 xml 字符串。TripIt 的人似乎认为 xml 参数可能没有包含在 signature_base_string 中,但是当我输出(来自 lib/signature/base.rb)时,我看到:
POST&https%3A%2F%2Fapi.tripit.com%2Fv1%2Fcreate&oauth_consumer_key %3D%26oauth_nonce %3Djs73Y9caeuffpmPVc6lqxhlFN3Qpj7OhLcfBTYv8Ww%26oauth_signature_method %3DHMAC-SHA1%26oauth_timestamp%3D1252011612%26oauth_token %3D%26oauth_version%3D1.0%26xml%3D%25253CRequest%25253E % 25250A%252520%252520%25253CTrip%25253E%25250A %252520%252520%252520%252520%25253Cstart_date%25253E2008-12-09%25253C %252Fstart_date%25253E%25250A %252520%252520%252520%252520%25253Cend_date%25253E2008-12- 27%25253C %252Fend_date%25253E%25250A %252520%252520%252520%252520%25253Cprimary_location%25253ENew %252520York%252C%252520NY%25253C%252Fprimary_location%25253E%25250A %252520%252520%25253C%252FTrip%25253E%25250A%25253C% 252F请求%25253E %25250A
这对我来说似乎是正确的。
我输出签名(来自同一个文件)并且输出与 lib/client/net_http.rb 中 Auth 标头的 oauth_signature 参数不匹配。它已在 auth 标头中进行了 URL 编码。这个对吗?
任何人都知道宝石是否损坏/是否有修复?我发现很难追踪一些代码。