繁体   English   中英

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

[英](How) can I send (prepared) requests with requests.OAuth2Session?

运行以下命令时(显然是用我们的 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)

通过OAuth2Session发送时如何重用原始Request对象?

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 客户端将令牌添加到该数据之前,您可以在稍微不同的包装中更改相同的请求数据。

也就是说,如果您不需要使用自动刷新或可以自己处理令牌过期,则可以直接访问OAuth2Sesson包装的oauthlib客户端 如果您已经获取了令牌,您可以在准备之前签署您的请求:

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()方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM