Когда я пытаюсь отправить запрос в Список учетных записей конечная точка в песочнице (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
Что еще я могу попробовать отладить это?