本文档讨论了如何在Requests中使用各种身份验证。
许多WEB服务需要身份验证,并且有许多不同的类型。下面,我们将从简单到复杂介绍Requests中各种可用的身份验证形式。
基本身份认证HTTP Basic Auth
许多需要身份验证的WEB服务都使用HTTP Basic Auth。这是最简单的一种身份认证,并且 Requests 对这种认证方式的支持是直接开箱即可用。使用HTTP Basic Auth发出请求非常简单:
>>> from requests.auth import HTTPBasicAuth
>>> requests.get('https://api.github.com/user', auth=HTTPBasicAuth('user', 'pass'))
<Response [200]>
实际上,HTTP Basic Auth非常常见,因此Requests提供了一个方便快捷的方法来使用它:
>>> requests.get('https://api.github.com/user', auth=('user', 'pass'))
<Response [200]>
在这样的元组中提供认证信息与上前一个的HTTPBasicAuth
示例完全相同。
netrc身份认证
如果没有使用auth
参数指定身份认证方法,Requests将尝试从用户的netrc文件中获取对应URL网址的身份认证信息。netrc文件包含信息将覆盖使用headers=
设置的原始HTTP认证头。
如果找到主机名的认证信息,则使用HTTP Basic Auth发送请求。
摘要式身份认证
另一种非常流行的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 认证的请求:
>>> 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 代码库。
OAuth2和OpenID连接身份认证
requests-oauthlib
库还处理OAuth2,OAuth2是OpenID Connect身份验证机制的基础。有关各种OAuth2认证管理流的详细信息,请参阅requests-oauthlib OAuth2文档:
其他身份认证
Requests的设计使得很容易使用其他形式的身份认证。开源社区的成员经常为更复杂或不常用的身份验证格式编写身份认证处理程序。其中一些最优秀的已被收集在Requests organization 页面中,包括:
新的身份认证
如果找不到所需的身份认证,可以自己实现。在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]>
当一个身份认证程序附加到一个请求时,在设置 request 期间就会调用该模块。因此,__call__()
方法必须执行使身份认证有效所需的操作。某些形式的身份认证还将添加钩子以提供进一步的功能。
你可以在Requests organization 页面的auth.py
文件中找到更多示例。