驗證

本文討論如何在 Requests 中使用各種不同的驗證方式。

許多網路服務需要驗證,而且驗證類型繁多。以下,我們概述 Requests 中可用的各種驗證形式,從簡單到複雜。

基本驗證

許多需要驗證的網路服務接受 HTTP 基本驗證 (HTTP Basic Auth)。這是最簡單的一種,而 Requests 開箱即用就支援它。

使用 HTTP 基本驗證發送請求非常簡單

>>> from requests.auth import HTTPBasicAuth
>>> basic = HTTPBasicAuth('user', 'pass')
>>> requests.get('https://httpbin.org/basic-auth/user/pass', auth=basic)
<Response [200]>

事實上,HTTP 基本驗證非常常見,因此 Requests 提供了一個方便的簡寫方式來使用它

>>> requests.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass'))
<Response [200]>

像這樣以 tuple (元組) 提供憑證,與上面的 HTTPBasicAuth 範例完全相同。

netrc 驗證

如果沒有透過 auth 參數提供驗證方法,Requests 將嘗試從使用者的 netrc 檔案中取得 URL 主機名稱的驗證憑證。netrc 檔案會覆寫使用 headers= 設定的原始 HTTP 驗證標頭。

如果找到主機名稱的憑證,請求將使用 HTTP 基本驗證發送。

摘要驗證

另一種非常流行的 HTTP 驗證形式是摘要驗證 (Digest Authentication),Requests 也開箱即用就支援它

>>> from requests.auth import HTTPDigestAuth
>>> url = 'https://httpbin.org/digest-auth/auth/user/pass'
>>> requests.get(url, auth=HTTPDigestAuth('user', 'pass'))
<Response [200]>

OAuth 1 驗證

OAuth 是許多 Web API 常見的驗證形式。requests-oauthlib 函式庫讓 Requests 使用者可以輕鬆地發送 OAuth 1 驗證的請求

>>> import requests
>>> from requests_oauthlib import OAuth1

>>> url = 'https://api.twitter.com/1.1/account/verify_credentials.json'
>>> auth = OAuth1('YOUR_APP_KEY', 'YOUR_APP_SECRET',
...               'USER_OAUTH_TOKEN', 'USER_OAUTH_TOKEN_SECRET')

>>> requests.get(url, auth=auth)
<Response [200]>

如需更多關於 OAuth 流程運作方式的資訊,請參閱官方 OAuth 網站。如需 `requests-oauthlib` 的範例和文件,請參閱 GitHub 上的 requests_oauthlib 儲存庫

OAuth 2 和 OpenID Connect 驗證

requests-oauthlib 函式庫也處理 OAuth 2,這是 OpenID Connect 的基礎驗證機制。有關各種 OAuth 2 憑證管理流程的詳細資訊,請參閱 requests-oauthlib OAuth2 文件

其他驗證

Requests 的設計允許輕鬆快速地外掛其他形式的驗證。開源社群的成員經常為更複雜或較不常用的驗證形式編寫驗證處理常式。其中一些最好的已被匯集在 Requests 組織下,包括

如果您想使用任何這些驗證形式,請直接前往它們的 GitHub 頁面並按照說明操作。

新的驗證形式

如果您找不到您想要的驗證形式的良好實作,您可以自行實作。Requests 讓新增您自己的驗證形式變得容易。

若要這樣做,請繼承 AuthBase 並實作 __call__() 方法

>>> import requests
>>> class MyAuth(requests.auth.AuthBase):
...     def __call__(self, r):
...         # Implement my authentication
...         return r
...
>>> url = 'https://httpbin.org/get'
>>> requests.get(url, auth=MyAuth())
<Response [200]>

當驗證處理常式附加到請求時,它會在請求設定期間被呼叫。因此,__call__ 方法必須執行任何使驗證工作所需的動作。某些驗證形式還會額外新增 hook (鉤子) 以提供更多功能。

更多範例可以在 Requests 組織下和 auth.py 檔案中找到。