gpt4 book ai didi

python - (如何)我可以使用 requests.OAuth2Session 发送(准备好的)请求?

转载 作者:行者123 更新时间:2023-11-28 22:11:28 25 4
gpt4 key购买 nike

当运行以下命令时(显然用我们的 API 替换了 example.com)

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 发送对象时?

最佳答案

OAuth2Session 实现不会覆盖 Session.prepare_request()Session.send()方法,只有 Session.request()已经特化了。这是因为它以相同的方法处理自动刷新,需要发送更多请求。

为了支持更改这些请求,该库提供了一个合规 Hook 工具,在该过程中的特定点调用一个 Hook 可以更改请求的详细信息。 OAuth2Session 对象,从 0.4.0 版本开始,支持 3 种不同的钩子(Hook):

  • access_token_response:传递来自 access token request 的响应,在解析响应以提取 token 之前。
  • refresh_token_response:传递来自 refresh token request 的响应,在响应被解析之前再次出现。
  • protected_request:传递用于访问 protected 资源的请求的 url、 header 和正文(因此请求应包含有效 token )。

几个included compliance fixers使用这些 Hook 从某些提供者的响应中添加缺失的元素,并在某些 API 偏离 OAuth 标准(关于它们如何处理 token )时更新传出请求。

protected_request 是这里有趣的钩子(Hook),因为它传递的数据与您在使用 request.Request()/session 时通常想要更改的数据相同.prepare_request()/session.send() 模式。在 oauthlib 客户端将 token 添加到该数据之前,您可以更改包装略有不同的相同请求数据。

也就是说,如果您不需要使用自动刷新或可以自己处理 token 过期,则可以访问 oauthlib client OAuth2Sesson 直接包装。如果你已经fetched a token ,您可以在准备之前签署您的请求:

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() method直接。

关于python - (如何)我可以使用 requests.OAuth2Session 发送(准备好的)请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55655117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com