认证¶
本文讨论了对请求使用各种类型的身份验证。
许多Web服务需要身份验证,并且有许多不同的类型。下面,我们概述了请求中可用的各种形式的身份验证,从简单到复杂。
基本身份验证¶
许多需要身份验证的Web服务接受HTTP基本身份验证。这是最简单的类型,请求直接支持它。
使用HTTP基本身份验证进行请求非常简单:
>>> from requests.auth import HTTPBasicAuth
>>> requests.get('https://api.github.com/user', auth=HTTPBasicAuth('user', 'pass'))
<Response [200]>
事实上,HTTP基本身份验证非常常见,请求为使用它提供了一个方便的简写:
>>> requests.get('https://api.github.com/user', auth=('user', 'pass'))
<Response [200]>
在这样的元组中提供凭据与 HTTPBasicAuth
上面的例子。
netrc身份验证¶
如果没有使用 auth
参数,请求将尝试从用户的netrc文件获取URL主机名的身份验证凭据。netrc文件覆盖用'headers=`'设置的原始HTTP身份验证头。
如果找到主机名的凭据,则使用HTTP基本身份验证发送请求。
摘要式身份验证¶
另一种非常流行的HTTP身份验证形式是摘要式身份验证,请求也支持这种即兴方式:
>>> 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身份验证¶
对于多个Web API,一种常见的身份验证形式是OAuth。这个 requests-oauthlib
库允许请求用户轻松进行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 网站。有关OAuthlib请求的示例和文档,请参阅 requests_oauthlib GitHub上的存储库
OAuth 2和OpenID连接身份验证¶
这个 requests-oauthlib
库还处理OAuth2,这是支持OpenIDConnect的身份验证机制。见 requests-oauthlib OAuth2 documentation 有关各种OAuth 2凭据管理流的详细信息:
其他身份验证¶
请求的设计允许其他形式的身份验证轻松快速地插入。开源社区的成员经常为更复杂或不常用的身份验证形式编写身份验证处理程序。Some of the best have been brought together under the Requests organization ,包括:
如果您想使用这些形式的任何一种身份验证,请直接转到他们的Github页面并按照说明进行操作。
新形式的身份验证¶
如果您找不到所需身份验证形式的良好实现,您可以自己实现它。请求使添加您自己的身份验证形式变得容易。
为此,子类 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__
因此,方法必须执行使身份验证生效所需的任何操作。某些形式的身份验证还将添加钩子以提供进一步的功能。
更多示例可在 Requests organization 而在 auth.py
文件。