(Как) я могу отправить (подготовленные) запросы с запросами. OAuth2Session? - PullRequest
2 голосов
/ 12 апреля 2019

При выполнении следующего (при замене example.com нашим API, очевидно)

req = Request('GET', 'https://example.com')
# client is a customized OAuth2Session
client.authorize(self.username, self.password, self.auth_key)
print(self.client.authorized) # True

следующие возвраты <Response [200]>:

response = client.request(req.method, req.url)

Но это возвращает <Response [401]>:

 prepped = client.prepare_request(req)
 response = client.send(prepped)

Как я могу повторно использовать оригинальный объект Request при отправке через OAuth2Session?

1 Ответ

4 голосов
/ 28 апреля 2019

Реализация OAuth2Session не переопределяет методы Session.prepare_request() или Session.send(), только Session.request() является специализированным. Это потому, что он обрабатывает автообновление тем же способом, требуя отправки большего количества запросов.

Для поддержки изменения этих запросов библиотека предлагает средство соответствия хуков , где в определенных точках процесса вызывается хук, который может изменять детали запроса. Объект OAuth2Session, начиная с версии 0.4.0, поддерживает 3 различных перехвата:

  • access_token_response: передал ответ от запроса токена доступа , прежде чем ответ будет проанализирован для извлечения токена.
  • refresh_token_response: перед ответом на синтаксический анализ ответа передан ответ от запроса маркера обновления.
  • protected_request: передал URL, заголовки и тело запросов, используемых для доступа к защищенным ресурсам (таким образом, запрос, который должен содержать действительный токен).

Несколько включали исправления соответствия используют эти ловушки для добавления отсутствующих элементов из ответов от определенных поставщиков и для обновления исходящих запросов, когда определенные API отклоняются от стандарта OAuth в отношении того, как они обрабатывают токены.

protected_request - интересный хук, так как ему передаются те же данные, которые вы обычно хотели бы изменить при использовании шаблона request.Request() / session.prepare_request() / session.send(). Вы можете изменить одни и те же данные запроса в несколько другой упаковке, прежде чем клиент oauthlib сможет добавить токен к этим данным.

Тем не менее, если вам не нужно использовать автообновление или вы можете самостоятельно обрабатывать истечение срока действия токена, вы можете получить прямой доступ к oauthlib клиенту , который OAuth2Sesson переносит. Если вы уже получили токен , вы можете подписать свой запрос перед подготовкой с помощью:

from oauthlib.oauth2 import TokenExpiredError

req = Request('GET', 'https://example.com')
try:
    req.url, req.headers, req.data = client._client.add_token(
        req.url, http_method=req.method, body=req.data, headers=req.headers
    )
except TokenExpiredError:
    # handle token expiration
    pass

else:
    prepped = client.prepare_request(req)
    response = client.send(prepped)

Используется метод add_token() клиента oauthlib напрямую .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...