身份验证 — 请求文档

来自菜鸟教程
Requests/docs/latest/user/authentication
跳转至:导航、​搜索

验证

本文档讨论了对请求使用各种身份验证。

许多 Web 服务需要身份验证,并且有许多不同的类型。 下面,我们概述了请求中可用的各种形式的身份验证,从简单到复杂。

基本认证

许多需要身份验证的 Web 服务都接受 HTTP 基本身份验证。 这是最简单的一种,Requests 直接支持它。

使用 HTTP 基本身份验证发出请求非常简单:

>>> 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 示例完全相同。

网络认证

如果没有使用 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 网站。 有关 requests-oauthlib 的示例和文档,请参阅 GitHub 上的 requests_oauthlib 存储库


OAuth 2 和 OpenID Connect 身份验证

requests-oauthlib 库还处理 OAuth 2,这是支持 OpenID Connect 的身份验证机制。 有关各种 OAuth 2 凭证管理流程的详细信息,请参阅 requests-oauthlib OAuth2 文档


其他认证

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__ 方法必须做任何需要使认证工作的事情。 某些形式的身份验证将额外添加挂钩以提供更多功能。

更多示例可以在 请求组织auth.py 文件中找到。