【问题标题】:Am I getting the signature_base correct?我得到的 signature_base 正确吗?
【发布时间】:2017-09-12 02:38:58
【问题描述】:

我现在可以正确登录并获得密码,所以我仍将其视为进度。
有人可以检查我正在加密的字符串吗?
“错误请求”还有什么含义?

首先,我得到了 AccessToken,
生成这个签名库

'GET&https%3A%2F%2Fetws.etrade.com%2Foauth%2Frequest_token&oauth_callback%3Doob%26oauth_consumer_key%3Dc5164d11e1a0a23901d75e7aa1993085%26oauth_nonce%3D565e334127934d65aa4375d0cd2770a1%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1502146468%26oauth_version%3D1.0'

然后它调用SignContext来执行这一行

signingContext.SignatureBase = authContext.GenerateSignatureBase();   

生成此签名库

'GET&https%3A%2F%2Fetws.etrade.com%2Foauth%2Frequest_token&oauth_callback%3Doob%26oauth_consumer_key%3Dc5164d11e1a0a23901d75e7aa1993085%26oauth_nonce%3D565e334127934d65aa4375d0cd2770a1%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1502146468%26oauth_version%3D1.0'

然后它得到引脚。

然后它调用 ExchangeRequestTokenForAccessToken
生成这个签名库

'GET&https%3A%2F%2Fetws.etrade.com%2Foauth%2Faccess_token&oauth_consumer_key%3Dc5164d11e1a0a23901d75e7aa1993085%26oauth_nonce%3De63bba497c24492ab0d60366526c781a%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1502146597%26oauth_token%3D6WHEWvcaVYx59bRxzic%252FXJGGYrz4TGdH5uvlfNCdkOY%253D%26oauth_verifier%3DNHD85%26oauth_version% 3D1.0'

然后它使用这个签名库再次对上下文进行签名

'GET&https%3A%2F%2Fetws.etrade.com%2Foauth%2Faccess_token&oauth_consumer_key%3Dc5164d11e1a0a23901d75e7aa1993085%26oauth_nonce%3De63bba497c24492ab0d60366526c781a%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1502146597%26oauth_token%3D6WHEWvcaVYx59bRxzic%252FXJGGYrz4TGdH5uvlfNCdkOY%253D%26oauth_verifier%3DNHD85%26oauth_version% 3D1.0'

然后我尝试获取 A 的报价
有了这个签名库

'GET&https%3A%2F%2Fetws.etrade.com%2Fmarket%2Frest%2Fquote%2FA&detailFlag%3DALL%26oauth_consumer_key%3Dc5164d11e1a0a23901d75e7aa1993085%26oauth_nonce%3D4a3640c5fc5c40b490c475a2e6c0228e%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1502146666%26oauth_token%3D77vmxV1reXdgDJewWspVKmOduwdDsZGVvLfZBUtBSms%253D% 26oauth_version%3D1.0'

检索报价失败并返回:

2017 年 8 月 7 日下午 5:57:46 - 标题开始 2017 年 8 月 7 日下午 5:58:18 - 授权:OAuth
oauth_token='77xmvV1reXdgDJewWspVKmOduwdDsZGVvLfZUBtBSms%3D',oauth_nonce='4a3640c5fc5c40b490c475a2e6c0228e',oauth_consumer_key='c5164d11e1a0a23901d75e7aa1993085',oauth_signature_method='HMAC-SHA1',oauth_timestamp='1502146666',oauth_version='1.0',oauth_signature='2OihTU%2BphJjPuvp82lR8Z2QhE24%3D' 2017 年 8 月 7 日下午 5:58:18 - 标题结束 2017 年 8 月 7 日下午 5:58:18 - System.Net.WebException:远程服务器返回错误:(400) 错误的请求。在 System.Net.HttpWebRequest.GetResponse()
在 EquityMetrics.Retrieve.ETradeModel.GetResponse(OAuthSession 会话,字符串 url) 在 C:{path}\Model\ETradeModel.cs:line 94
2017 年 8 月 7 日下午 5:58:18 - 编译指示:无缓存 apiServerName:11w44m3
nnCoection:关闭传输编码:分块缓存控制: 无缓存,无存储内容类型:应用程序/xml 日期:星期一, 2017 年 8 月 7 日 22:58:18 GMT 服务器:Apache

【问题讨论】:

  • 看不出有什么明显的问题,您发送到“etws.etrade.com/market/rest/quote/A&detailFlag=ALL”的实际 URL 是?这是您自己的代码或 Etrade 提供的库吗?另请注意 detailFlag = ALL 是默认设置,因此您可以忽略它并尝试一下。您也可以将标头作为 URL 参数直接输入到浏览器中以排除代码问题。
  • AFAIK,除了粗略的说明,etrade 不提供任何东西。加密和签名库位于 oauth 库的深处。我的代码正在调用 oauth 代码。我在这一点上被困了将近一个月,而 etrade API 支持小组也无法提供帮助。
  • 由于我收到了错误的请求,似乎有关正在加密的请求的某些内容是错误的。但我没看到。
  • 我猜它不是签名,因为你会得到 invalid_signature 错误。我认为 Bad Request 意味着一些错误的请求标头/值,这就是为什么我建议在浏览器中输入(应该在 Chrome 中工作),并去掉详细标志参数以创建更简单的测试。我注意到另一件事,我会把它放在答案中

标签: .net oauth etrade-api


【解决方案1】:

根据Oauth 1.0 spec,授权标头应使用 ascii 值 34,这是双引号,而不是单引号。参数也应按名称的字母顺序排序。在上面的错误消息中,它看起来像是使用单引号和未排序的参数。它应该如下所示(为便于阅读添加了换行符):

Authorization: OAuth 
oauth_token="77xmvV1reXdgDJewWspVKmOduwdDsZGVvLfZUBtBSms%3D",  
oauth_nonce="4a3640c5fc5c40b490c475a2e6c0228e",  
oauth_consumer_key="c5164d11e1a0a23901d75e7aa1993085",
oauth_signature="2OihTU%2BphJjP",  
oauth_signature_method="HMAC-SHA1",  
oauth_timestamp="1502146666",  
oauth_version="1.0"

【讨论】:

  • 你是对的。它们是原文中的双引号。我将其更改为单引号以发布到 etrade API 组,因为他们不允许“。在他们没有回答后我在此处发布时没想过将其更改回来。很好。
  • 标题是否算作参数?没关系。它们已经处于 alpha 顺序。所以不是这样。
  • 我的意思是“授权”标头中的参数。例如 oauth_signature 不按顺序。
  • 对不起,我很迟钝。我看到了 detailFlag、oauth_consumer_key、oauth_nonce、oauth_signature_method、oauth_timestamp、oauth_token、oauth_version,这对我来说是正确的。感谢您的耐心等待。
  • 在 oauth_version 之后我看到 oauth_signature,它应该位于 oauth_signature_method 之前。在上面添加了示例。
【解决方案2】:

从浏览器中点击 URL 后,我开始收到更好的错误消息,这导致了解决方案。但如何做到这一点并不明显。

对于这个标题:

Authorization: OAuth oauth_consumer_key="c6154d11e1a0a29301d75e7aa1993085",oauth_nonce="simTGhOB4T7",oauth_signature="Dij6ZXwcBda78Rk54K3k3UUfGMc%3D",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1505152250",oauth_token="DnMnZQTQUqaJxAFJNwTy76lEaP5toiWt2QeI4POZnKY%3D",oauth_version="1.0"

在浏览器中使用此 URL 以获得更好的错误消息:

https://etws.etrade.com/market/rest/quote/A?oauth_consumer_key=c6154d11e1a0a29301d75e7aa1993085&oauth_nonce=simTGhOB2T7&oauth_signature=Dij6ZXwcBda78Rk54K3k3UUfGMc%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1505152250&oauth_token=DnMnZQTQUqaJxAFJNwTy76lEaP5toiWt2QeI4POZnKY%3D&oauth_version=1.0

OTOH,排序顺序似乎无关紧要,在签名的基础之外,如规范中所述。

【讨论】:

  • 感谢@kingdc 提供了导致解决方案的线索。
猜你喜欢
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 2021-10-08
相关资源
最近更新 更多