0

我主要是在寻求有关如何调试问题的指导。

我在构建 Ruby 客户端以使用 etrade api 方面取得了很大进展。所有 GET 请求都成功且没有错误。

我终于到了可以预览订单的地方。预览 API 需要 POST。所有尝试都以“401 Unauthorized”失败,并且“www-authenticate”标头字段具有以下值:

    "www-authenticate"=>
  ["OAuth realm=https://etws.etrade.com/,oauth_problem=signature_invalid"]

我修改了 python 示例客户端以提交 JSON 格式的订单,它工作得很好。我在这里附上标题信息:

 Header: {
'User-Agent': 'python-requests/2.26.0', 
'Accept-Encoding': 'gzip, deflate', 
'Accept': '*/*', 
'Connection': 'keep-alive', 
'content-type': 'application/json', 
'consumerkey': 'redacted', 
'Cookie': 'JSESSIONID=B0991AEDFB40036760E989CD68D67A02.tomcat2', 
'Content-Length': '678', 
'Authorization': 'OAuth realm="",oauth_consumer_key="redacted",oauth_nonce="b1c65498f902f514f3b2beb5c7cabdffd0de869b",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1637599276",oauth_token="at4brpqxlCWCqlB7Ee4L5EQt1MmjNxbejM2buystXYE%3D",oauth_version="1.0",oauth_signature="%2BfWs51yqISrSiSSRICjA0g7th88%3D"'}

以下是使用我的 Ruby 客户端尝试失败的 HTTP 标头:

{
"content-type"=>["application/json"],
"accept-encoding"=>["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"],
 "accept"=>["*/*"],
 "user-agent"=>["OAuth gem v0.5.6"],
 "content-length"=>["666"],
 "authorization"=>
  ["OAuth oauth_body_hash=\"%2BlouJdUEjS15m7dFs2YNSjJQFBA%3D\", oauth_consumer_key=\"redacted\", oauth_nonce=\"Hfy7oEwa7mLRXVBXtzh7Q6pqYOOltCVSWFJbNuiDnwc\", oauth_signature=\"gheE%2BlZV3EXO2LxnQvBJknfw20c%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1637607291\", oauth_token=\"DO%2B92%2Bsz8Hv03lkCYbV1n6XTrH2emCIwcJ%2FHyWS%2BUOw%3D\", oauth_version=\"1.0\""],
 "connection"=>["close"],
 "host"=>["api.etrade.com"]}

我正在使用https://rubygems.org/gems/oauth gem,它是 Oauth 1.0/1.0a 的 Ruby 标准。我没有写任何代码。大概 get/post/put 函数都可以正常工作,因为它们被许多其他项目使用。

但很明显,当我进行 POST 时,在 oauth 级别上没有正确设置或计算某些东西。谷歌搜索表明,当“Content-Type”字段设置不正确时,有时会生成此错误,因此我确保将其设置为“application/json”。没有帮助。顺便说一句,我也尝试发送 XML(并设置适当的内容类型),但没有任何乐趣。我基本上复制/粘贴了文档中的示例,因此我知道 POST 正文是正确的。我还将相同的信息粘贴到 python 测试客户端中,它在那里工作得很好。令人沮丧!

我没有发布代码,因为没有办法制作超级简单的复制品。任何人都有如何调试这个东西的指导。有没有我可以用来验证 oauth 件的在线工具?

4

0 回答 0