使用 Python 中的 requests 模块执行身份验证

Vaibhav Vaibhav 2023年1月30日 2022年5月17日
  1. 在 Python 中使用 requests 模块执行身份验证
  2. Python 中的其他身份验证方法
使用 Python 中的 requests 模块执行身份验证

超文本传输​​协议是万维网或互联网的基础。本质上,它是一个应用层协议,其主要任务是将数据从 Web 服务器传输到 Web 浏览器,例如 Chrome、Edge、Firefox 和 Brave。

HTTP 请求针对唯一的网址或 URL 进行,以获取所需的资源和媒体文档,例如 HTML、PDF、文本文件、图像、视频等。

URL,也称为统一资源定位器,是用于在 Internet 上定位内容的唯一网址或路径,每个 URL 都指向特定的内容。

Python 是一种动态类型的多用途编程语言,支持大量库。requests 模块提供了使用 Python 编程语言执行 HTTP 请求的实用程序。

在 Python 中使用 requests 模块执行身份验证

要在 requests 模块的帮助下执行身份验证,我们可以使用 requests 库中的 HTTPBasicAuth 类。这个类接受两个参数,一个用户名和一个密码。

这个类代表一个 HTTP Basic Authentication,它附加到一个请求上。身份验证对象提供给 get() 方法的 auth 参数。

让我们通过一个例子来理解这个类及其用法。请参考以下 Python 代码。

from requests.auth import HTTPBasicAuth

url = "<any valid url>"
basic = HTTPBasicAuth("username", "password")
requests.get(url, auth = basic)

身份验证成功后,将获得具有 200 状态代码的响应对象。

编写上述代码的另一种更直接的方法如下。

from requests.auth import HTTPBasicAuth

url = "<any valid url>"
requests.get(url, auth = ("username", "password"))

可以为元组中的 auth 参数提供用户名和密码。

Python 中的摘要式身份验证

另一种流行且直接的 HTTP 身份验证形式是摘要式身份验证。这种类型的身份验证可以在 HTTPDigestAuth 的帮助下执行。

HTTPBasicAuth 类一样,此类也接受用户名和密码。

让我们看一个例子。请参考以下 Python 代码。

from requests.auth import HTTPBasicAuth

url = "<any valid url>"
requests.get(url, auth = HTTPDigestAuth("username", "password"))

Python 中的 OAuth 1 身份验证

OAuth 1 身份验证是一种强大的身份验证形式。

在这里,OAuth 代表开放授权。这种形式的身份验证适用于使用 OAuth 的 Web API 或应用程序编程接口。

这种类型的身份验证可以在 OAuth1 类的帮助下执行。这个类是 requests-oauthlib 库的一部分。要安装这个 Python 库,请使用以下 pip 命令。

pip install requests-oauthlib

让我们借助一个例子来理解这个类。请参阅以下 Python 代码。

import requests
from requests_oauthlib import OAuth1

url = "<any valid url>"
YOUR_APP_KEY = "YOUR_APP_KEY"
YOUR_APP_SECRET = "YOUR_APP_SECRET"
USER_OAUTH_TOKEN = "USER_OAUTH_TOKEN"
USER_OAUTH_TOKEN_SECRET = "USER_OAUTH_TOKEN_SECRET"
auth = OAuth1(YOUR_APP_KEY, YOUR_APP_SECRET, USER_OAUTH_TOKEN, USER_OAUTH_TOKEN_SECRET)
requests.get(url, auth = auth)

Python 中的 OAuth 2 身份验证

2012 年,OAuth 1 被称为 OAuth 2 的更新且更可靠的身份验证协议所取代。

OAuth 2 的帮助下,开发人员和企业主可以通过他们的网站提供对资源的同意访问,并限制可疑行为。

OAuth 2 身份验证使用访问令牌。访问令牌是一种允许用户进行身份验证的特殊数据。

用户必须在向网站服务器发出的每个请求中包含其访问令牌,以证明其身份外行身份验证并访问他们有权访问的任何内容。

由于可以使用网络浏览器轻松访问令牌,因此出于安全目的,每个访问令牌都有一个到期日期和时间。

使用 OAuth 2 身份验证,用户可以在多个平台上进行身份验证,从而为最终用户节省时间并提升令人满意的用户体验。

可以使用 requests_oauthlib 模块执行 OAuth 2 身份验证。这个模块有一个我们可以使用的类 OAuth2Session

以下是 OAuth2Session 的类签名。

class requests_oauthlib.OAuth2Session(client_id=None, client=None, auto_refresh_url=None, auto_refresh_kwargs=None, scope=None, redirect_uri=None, token=None, state=None, token_updater=None, **kwargs)

让我们通过一个例子来了解它的用法。

from requests_oauthlib import OAuth2Session

client_id = "your_client_id"
client_secret = "your_client_secret"
url = "<any valid url>"
oauth = OAuth2Session(client_id, redirect_uri = url)
token = oauth.fetch_token("<url to fetch access token>", client_secret = client_secret)
r = oauth.get("<url to a resource>")

OAuth2Session 类接受 client_idclient_secret 用于执行实际身份验证。

url 是一个必须完成身份验证的好网站。我们使用此类对象的 fetch_token() 方法获取新的访问令牌。

该令牌将用于会话的其余部分以访问内容。这里,<url to fetch access token> 应该是一个 HTTPS 网址。

一旦获得令牌,我们就可以使用此类对象的 get() 方法安全地访问网站上的内容。

要了解有关此方法的更多信息,请参阅官方文档此处

Python 中的其他身份验证方法

除了上面提到的方法,我们还可以使用两个 Python 库进行身份验证。

  • requests Kerberos/GSSAPI
  • requests-ntlm

requests Kerberos/GSSAPI 库是一个基于 Python 的开源库,它扩大了 requests 库的范围。

requests 用于 HTTP 请求,但 requests Kerberos/GSSAPI 库支持 Kerberos/GSSAPI 身份验证和相互身份验证。

以下 Python 描述了如何使用此库执行基本身份验证。

import requests
from requests_kerberos import HTTPKerberosAuth

r = requests.get("<any valid url>", auth = HTTPKerberosAuth())

requests-ntlm 库是一个基于 Python 的开源库,用于 HTTP NTLM 身份验证。NTLM 代表 Windows NT LAN 管理器。

NTLM 协议通常被认为是不安全的,因为它是一个相当古老的协议并且基于过时的 密码学 算法。

因此,它很容易受到诸如传递哈希攻击和蛮力攻击等可疑攻击。要安装此库,请在任何终端中执行以下 pip 命令。

pip install requests_ntlm

下面的 Python 描述了如何使用这个库来执行 NTLM 身份验证。

import requests
from requests_ntlm import HttpNtlmAuth

requests.get("<any valid url>", auth = HttpNtlmAuth("domain\\username", "password"))
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

LinkedIn GitHub

相关文章 - Python Web