Реализация 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 напрямую .