【问题标题】:Getting an oauth request token from etrade in Python在 Python 中从 etrade 获取 oauth 请求令牌
【发布时间】:2015-04-19 05:03:22
【问题描述】:

我正在尝试使用这个东西从 Python 中的 etrade api(沙盒)获取 oauth 请求令牌:

import requests
from oauthlib.oauth1 import Client

consumer_key = 'foo'     # actual key used
consumer_secret = 'bar'  # actual secret used
request_url = 'https://etwssandbox.etrade.com/oauth/sandbox/request_token'

client = Client(consumer_key, client_secret = consumer_secret)
uri, headers, body = client.sign(request_url)
add_params = ', realm="", oauth_token= "", oauth_callback="oob"'
headers['Authorization'] += add_params

r = requests.get(url = uri, headers = headers)
print(r.text) # abbreviated resp: " . . . .auth_problem=consumer_key_rejected,oauth_problem_advice=The oauth_consumer_key foo can be used only in SANDBOX environment . . . 

生成的标头是:

{'Authorization': 'OAuth oauth_nonce="99985873301258063061424248905", oauth_timestamp="1424248905", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="foo", oauth_signature="A7ZY91UyZz6NfSGmMA5YWGnVM%2FQ%3D", realm="", oauth_token= "", oauth_callback="oob"'}

我也试过网址:'https://etwssandbox.etrade.com/oauth/sandbox/rest/request_token'

我已经尝试过不带 add_params 的标头(它似乎需要空白的 oauth_token?)

注意:令人困惑的是,响应会定期返回:“Http/1.1 400 Bad Request”,具有完全相同的 url/header。

知道我做错了什么吗?

【问题讨论】:

  • 错误信息是说消费者密钥只能在沙盒环境中使用。我知道您似乎正在使用沙盒网址...?但是……你确定是吗?
  • 网址直接来自他们的文档:developer.etrade.com/ctnt/dev-portal/…
  • @aychedee 你的问题问得很好。我不得不联系 etrade 以了解 oauth,即使在沙箱中,也是通过主 api 处理的。错误消息只会传播这种混乱。
  • 令人困惑的文档令人困惑:-)

标签: python oauth etrade-api


【解决方案1】:

etrade 的一位乐于助人的人澄清说,所有 oauth api 请求(无论您是否在沙箱中工作)都需要发送到主 api url:'https://etws.etrade.com/oauth/{api}'。

只有在对会话进行身份验证后,才应使用沙盒 URL:'https://etwssandbox.etrade.com/{non-oauth-module}/sandbox/rest/{api}'。

如果其他人在 python3 中使用 etrade 验证会话时遇到问题,这至少在沙箱中有效:

from rauth import OAuth1Service
import webbrowser 

def getSession():
    # Create a session
    # Use actual consumer secret and key in place of 'foo' and 'bar'
    service = OAuth1Service(
              name = 'etrade',
              consumer_key = 'foo',
              consumer_secret = 'bar',
              request_token_url = 'https://etws.etrade.com/oauth/request_token',
              access_token_url = 'https://etws.etrade.com/oauth/access_token',
              authorize_url = 'https://us.etrade.com/e/t/etws/authorize?key={}&token={}',
              base_url = 'https://etws.etrade.com')

    # Get request token and secret    
    oauth_token, oauth_token_secret = service.get_request_token(params = 
                                  {'oauth_callback': 'oob', 
                                   'format': 'json'})

    auth_url = service.authorize_url.format(consumer_key, oauth_token)

    # Get verifier (direct input in console, still working on callback)
    webbrowser.open(auth_url)
    verifier = input('Please input the verifier: ')

    return service.get_auth_session(oauth_token, oauth_token_secret, params = {'oauth_verifier': verifier})

# Create a session
session = getSession()

# After authenticating a session, use sandbox urls
url = 'https://etwssandbox.etrade.com/accounts/sandbox/rest/accountlist.json'

resp = session.get(url, params = {'format': 'json'})

print(resp)

【讨论】:

  • 谢谢。因此,在完成此操作后,我无法让沙盒 api 正常工作。身份验证正在工作。 token = self.authy() ourParams = {"oauth_consumer_key":self.consumer_key,"oauth_token":token,"module":"ACCOUNTS"} response = requests.get("https://etwssandbox.etrade.com/accounts/sandbox/rest/alerts/",params = ourParams) print(response.status_code) responseJSON = response.text print(responseJSON)
  • 我在响应中收到一个`999Invalid Request.`...它确实有一个 200 状态码
  • @Tizzee 这对我来说仍然是一个症结所在。我最终需要解决它,如果/当我这样做时,我会在上面发布。
  • @Tizzee 执行此操作时,我也收到响应 200 错误。是因为沙盒里没有账号吗?
【解决方案2】:

感谢@ethann - 这实际上仍然适用于 2020 年 6 月 17 日,但网址已更改。

from rauth import OAuth1Service
import webbrowser 

service = OAuth1Service(
          name = 'etrade',
          consumer_key = 'foo',
          consumer_secret = 'bar',
          request_token_url = 'https://apisb.etrade.com/oauth/request_token',
          access_token_url = 'https://apisb.etrade.com/oauth/access_token',
          authorize_url = 'https://us.etrade.com/e/t/etws/authorize?key={}&token={}',
          base_url = 'https://apisb.etrade.com')

oauth_token, oauth_token_secret = service.get_request_token(params =
       {'oauth_callback': 'oob', 
        'format': 'json'})

auth_url = service.authorize_url.format('foo again', oauth_token)
webbrowser.open(auth_url)
verifier = input('Please input the verifier: ')
session = service.get_auth_session(oauth_token, oauth_token_secret, params = {'oauth_verifier': verifier})

url = 'https://apisb.etrade.com/v1/accounts/list'
resp = session.get(url, params = {'format': 'json'})

print(resp.text)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    相关资源
    最近更新 更多