【问题标题】:(How) can I send (prepared) requests with requests.OAuth2Session?(如何)我可以使用 requests.OAuth2Session 发送(准备好的)请求吗?
【发布时间】:2020-03-07 04:29:01
【问题描述】:

当运行以下命令时(显然用我们的 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 对象时如何重用它?

【问题讨论】:

    标签: python python-3.x oauth-2.0 python-requests requests-oauthlib


    【解决方案1】:

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

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

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

    多个included compliance fixers 使用这些钩子从某些提供者的响应中添加缺失的元素,并在某些 API 偏离 OAuth 标准以了解它们如何处理令牌时更新传出请求。

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

    也就是说,如果您不需要使用自动刷新或可以自己处理令牌过期,则可以直接访问 OAuth2Sesson 包装的 oauthlib client。如果您已经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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      相关资源
      最近更新 更多