【问题标题】:generating oauth_signature for ETrade API using Python使用 Python 为 ETrade API 生成 oauth_signature
【发布时间】:2017-07-18 21:22:08
【问题描述】:

E*Trade API 允许您使用 RESTful 登录网站并操作帐户或检索报价信息。虽然我无法生成与位于底部的“实践问题”相匹配的 oauth_signature https://us.etrade.com/ctnt/dev-portal/getContent?contentId=306a9d46-58c2-4cac-85f6-7717aea056bd

简单的 HMAC-SMA1 算法已在下面进行了编码,并从此处 https://oauth.net/core/1.0a/#sig_base_example 重现了 oauth 核心 1.0a 签名值。虽然我无法获得 E*Trade 签名值来重现。

def generate_oauth_signature():
    from urllib.parse import quote_plus
    from hashlib import sha1
    import binascii
    import hmac

    key = quote_plus('7d30246211192cda43ede3abd9b393b9') + \
          '&' + \
          quote_plus('XCF9RzyQr4UEPloA+WlC06BnTfYC1P0Fwr3GUw/B0Es=')
    key = key.encode()
    raw = quote_plus('GET') + '&' + \
          quote_plus('https://etws.etrade.com/accounts/rest/accountlist') + '&' + \
          quote_plus('oauth_consumer_key=c5bb4dcb7bd6826c7c4340df3f791188&oauth_nonce=0bba225a40d1bbac2430aa0c6163ce44&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1344885636&oauth_token=VbiNYl63EejjlKdQM6FeENzcnrLACrZ2JYD6NQROfVI=')
    raw = raw.encode()
    hashed = hmac.new(key, raw, sha1)
    sig = hashed.digest()
    oauth_signature = quote_plus(binascii.b2a_base64(hashed.digest())[:-1])

该函数应该产生“%2FXiv96DzZabnUG2bzPZIH2RARHM%3D”,但我还没有。有没有人计算出 E*Trade API 的散列?

我知道 etradepy.py,它是一个不错的软件包,但有点过时,与当前的 E*Trade 网站不匹配。

【问题讨论】:

  • 我在 .NET 中,所以我只能在概念上提供帮助,而不是具体代码。
  • 查看该页面上的示例获取请求。签名进入获取请求。反之亦然。
  • 签名方法有两个参数,文本和密钥。密钥是“Consumer Secret 和 Token Secret,用 '&' 分隔”。所以在我看来你的那部分是正确的。我在任何一个页面上都没有看到关于要签名的文本应该是什么的任何详细信息。很确定它不应该包含 URL。尝试编码不同的片段。
  • 我的头看起来大致等授权:OAuth的组oauth_token = “UedyRLaPYUX0shFt3jYLPUVDhT5MsfOWQc%2F9tX2Szwg%3D”,oauth_nonce = “7f4352f8d79094648bc5629c39981d31”,oauth_consumer_key = “fc30012ef9f37fd768e935e84f1e413e”,oauth_signature_method = “HMAC-SHA1”,oauth_timestamp =“1500449672 ",oauth_version="1.0",oauth_signature="cayQmNCuz5dZSxEuwxyuHnhUFgs%3D"
  • 衷心感谢您在我的问题上花费了一些时间。这是一件有趣的事情,这个 oauth.... 但这来自 OAuth 网站 (oauth.net/core/1.0a/#anchor13)。

标签: python oauth etrade-api


【解决方案1】:

一个问题是 oauth_token 需要在参数字符串中进行编码(最终会被双重编码)。我的是:

oauth_consumer_key=c5bb4dcb7bd6826c7c4340df3f791188&oauth_nonce=0bba225a40d1bbac2430aa0c6163ce44&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1344885636&oauth_token=VbiNYl63EejjlKdQM6FeENzcnrLACrZ2JYD6NQROfVI%3D

【讨论】:

  • 字符串由 Python3 中的 quote_plus() 函数编码。然后,通过后面的 .encode() 将其编码为 utf-8。这是我传递给散列函数的内容;键= 7d30246211192cda43ede3abd9b393b9&XCF9RzyQr4UEPloA%2BWlC06BnTfYC1P0Fwr3GUw%2FB0Es%3D原始= GET&HTTPS%3A%2F%2Fetws.etrade.com%2Faccounts%2Frest%2Faccountlist&oauth_consumer_key%3Dc5bb4dcb7bd6826c7c4340df3f791188%26oauth_nonce%3D0bba225a40d1bbac2430aa0c6163ce44%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1344885636%26oauth_token%3DVbiNYl63EejjlKdQM6FeENzcnrLACrZ2JYD6NQROfVI%3D
  • @jsfa11 这就是我所说的双重编码。您的 oauth_token 应该已经单独编码,并且代码中的 quote_plus 将再次对其进行编码。例如,'=' 变为 %3D,然后变为 %253D。您的密钥字符串是正确的,但 '原始' 应该是:GET和HTTPS%3A%2F%2Fetws.etrade.com%2Faccounts%2Frest%2Faccountlist&oauth_consumer_key%3Dc5bb4dcb7bd6826c7c4340df3f791188%26oauth_nonce%3D0bba225a40d1bbac2430aa0c6163ce44%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1344885636%26oauth_token%3DVbiNYl63EejjlKdQM6FeENzcnrLACrZ2JYD6NQROfVI %253D
  • 你知道什么?感谢金达!我在这个上很慢。你的答案是正确的。
  • 我也花了很长时间才让他们的示例与我的示例相匹配(不是在 python 中),这不是一个非常直观的过程。
  • 您认为您可以再次提供帮助吗?我得到了我的令牌,它是秘密的,然后我认为访问一些报价是下一件容易的事情。我已经尝试了很多。新的时间戳,带有新令牌和秘密的新签名,带有和不带有验证码。只是不适合我。文档对请求的标头和 oauth 中包含的内容含糊不清。
猜你喜欢
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多