3

运行以下命令时(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

4

1 回答 1

4

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

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

  • access_token_response:在解析响应以提取令牌之前传递来自访问令牌请求的响应。
  • refresh_token_response:在解析响应之前再次传递来自刷新令牌请求的响应。
  • protected_request:传递用于访问受保护资源的请求的 url、标头和正文(因此应包含有效令牌的请求)。

一些包含的合规修复程序使用这些钩子从某些提供者的响应中添加缺失的元素,并在某些 API 偏离 OAuth 标准时更新传出请求以了解它们如何处理令牌。

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

于 2019-04-28T10:24:56.197 回答