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

При запуске следующего (при замене 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 ответ

Решение

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)

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

Другие вопросы по тегам