API ETrade — недействительный ключ потребителя и/или токен сеанса

Когда я пытаюсь отправить запрос в Список учетных записей конечная точка в песочнице (https://apisb.etrade.com/v1/accounts/list), я получаю HTTP 401 — Неавторизованный запрос — недействительный ключ потребителя и/или токен сеанса.

Я не понимаю, почему этот запрос не работает, так как я успешно вызываю Получите Access Token API, извлекая oauth_token и oauth_token_secret и используя их для подписи и выполнения запроса к списку учетных записей.

Чтобы еще больше запутаться, я скачал официальный клиент Etrade Python, поставил точку останова прямо перед списком учетных записей. вызывается и подтверждает, что мой код генерирует точно такой же oauth_signature с теми же параметрами запроса.

Кроме того, я фактически скопировал все параметры запроса, сгенерированные официальным клиентом Python, и вставил их в свой веб-браузер, и все еще получаю тот же Неавторизованный запрос - неверный ответ ключа потребителя и/или токена сеанса.

Для иллюстрации вот точка останова, которую я поставил в официальном клиенте Python (я заменил первые четыре буквы конфиденциальных ключей на 123a):

Breakpoint 1 at /Users/me/Downloads/EtradePythonClient/venv/lib/python3.9/site-packages/rauth/session.py:210
(Pdb) c
> /Users/me/Downloads/EtradePythonClient/venv/lib/python3.9/site-packages/rauth/session.py(210)request()
-> return super(OAuth1Session, self).request(method, url, **req_kwargs)

(Pdb) pprint.pprint(oauth_params)
{'oauth_consumer_key': '123a01814e407344bc2b385f3954679b',
 'oauth_nonce': '8230791e8c0253518a6b2dec8120b643fde93745',
 'oauth_signature': '123apxtEaUJmlvKFWv7zz+lfNk4=',
 'oauth_signature_method': 'HMAC-SHA1',
 'oauth_timestamp': 1614559929,
 'oauth_token': '123aMSpwaaWItBDgXQ/Te4M9363WSULWFdeHkh18B8s=',
 'oauth_version': '1.0'}
(Pdb) url
'https://apisb.etrade.com/v1/accounts/list.json'
(Pdb) method
'GET'

Используя приведенное выше, я создал следующий URL-адрес и вставил его в свой веб-браузер:

https://apisb.etrade.com/v1/accounts/list.json?oauth_consumer_key=123a01814e407344bc2b385f3954679b&oauth_nonce=8230791e8c0253518a6b2dec8120b643fde93745&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1614559929&oauth_token=123aMSpwaaWItBDgXQ/Te4M9363WSULWFdeHkh18B8s=&oauth_version=1.0&oauth_signature=123apxtEaUJmlvKFWv7zz+lfNk4=

но я получаю ответ HTTP 401 - Несанкционированный запрос - недействительный ключ потребителя и/или токен сеанса.

И тем не менее, запрос работает в официальном клиенте Python (пока я сначала не попробую его в своем браузере, иначе я получу ошибку «Ошибка: oauth_problem=nonce_used» в клиенте Python).

Я заметил одну вещь: официальный клиент Python добавляет параметр oauth_version=1.0, но мои запросы по-прежнему не выполняются независимо от того, включаю ли я этот параметр и подписываюсь с ним. Я также заметил, что официальный клиент Python добавляет .json к URL-адресу, но снова я все еще получаю несанкционированную ошибку, независимо от того, включаю ли я .json.

Я также пытался отправить параметры OAuth в качестве заголовка HTTP, а не в качестве параметров URL, но все равно получаю ту же ошибку.

Я также кодирую rfc3986 (процентное кодирование) параметры URL-адреса в моем запросе, который работает для запроса Get Access Token, но не для запроса списка учетных записей.

Обратите внимание, что я использую следующие URL-адреса для токена запроса, токена доступа и API для песочницы:

https://apisb.etrade.com/oauth/request_token
https://us.etrade.com/e/t/etws/authorize?key=${oauth_consumer_key}&token=${state.oauth_token}
https://apisb.etrade.com/oauth/access_token
https://apisb.etrade.com/v1/accounts/list

Что еще я могу попробовать отладить это?


person mark    schedule 01.03.2021    source источник


Ответы (1)


Догадаться:

Проблема заключалась в том, что, поскольку я отправляю свои запросы из веб-браузера (расширение Chrome), мой запрос включал файл cookie, из-за чего API выдавал ошибку сеанса.

Я использую Fetch API. Установка {"credentials": "omit"} в параметре init пропускает заголовок Cookie и решает проблему.

person mark    schedule 01.03.2021