簡體   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