pin_drop当前位置:知识文库 ❯ 图文

requests认证Auth教程 - Basic/Digest/自定义认证详解

一、HTTP认证概述

HTTP认证是验证客户端身份的机制,requests库通过auth参数支持多种认证方式。最常用的是Basic Auth(基本认证)和Digest Auth(摘要认证),此外还支持自定义认证方案。认证信息可以附加到单个请求或Session级别的所有请求中。

在API调用、内部服务通信和第三方服务集成中,认证是必不可少的环节。正确理解和使用认证机制,可以确保数据访问的安全性和可靠性。

二、认证语法与参数

requests提供三种主要认证方式:Basic Auth、Digest Auth和自定义认证。

代码示例

# Basic Auth
requests.get(url, auth=('username', 'password'))

# Digest Auth
from requests.auth import HTTPDigestAuth
requests.get(url, auth=HTTPDigestAuth('username', 'password'))

# 自定义Auth
from requests.auth import AuthBase
class MyAuth(AuthBase):
    def __call__(self, r):
        r.headers['X-Custom-Auth'] = 'token'
        return r

内置认证类

认证类 说明 安全性
HTTPBasicAuth 基本认证,用户名密码Base64编码 低(明文传输)
HTTPDigestAuth 摘要认证,密码不直接传输 中(MD5摘要)
AuthBase 认证基类,可自定义认证方案 取决于实现

三、Basic Auth基本认证

Basic Auth是最简单的认证方式,使用元组传递用户名和密码即可。

代码示例

import requests
from requests.auth import HTTPBasicAuth

# 方式1:元组形式(最常用)
response = requests.get(
    'https://httpbin.org/basic-auth/admin/secret123',
    auth=('admin', 'secret123')
)
print(f"认证状态码: {response.status_code}")
print(f"认证结果: {response.json()}")

# 方式2:显式使用HTTPBasicAuth
response2 = requests.get(
    'https://httpbin.org/basic-auth/admin/secret123',
    auth=HTTPBasicAuth('admin', 'secret123')
)
print(f"显式认证状态码: {response2.status_code}")

输出结果:

代码示例

认证状态码: 200
认证结果: {'authenticated': True, 'user': 'admin'}
显式认证状态码: 200

四、认证失败处理

认证失败时服务器返回401状态码,requests不会自动抛出异常,需要手动检查状态码。

代码示例

import requests

# 使用错误的密码
try:
    response = requests.get(
        'https://httpbin.org/basic-auth/admin/secret123',
        auth=('admin', 'wrong_password')
    )
    print(f"错误密码状态码: {response.status_code}")
    if response.status_code == 401:
        print("认证失败:用户名或密码错误")
except requests.exceptions.RequestException as e:
    print(f"请求异常: {e}")

# 正确认证
response2 = requests.get(
    'https://httpbin.org/basic-auth/admin/secret123',
    auth=('admin', 'secret123')
)
if response2.ok:
    print(f"认证成功: {response2.json()}")

输出结果:

代码示例

错误密码状态码: 401
认证失败:用户名或密码错误
认证成功: {'authenticated': True, 'user': 'admin'}

五、自定义认证与Session级别

对于特殊的认证需求(如Token认证、API Key认证),可以通过继承AuthBase类实现自定义认证方案。同时,Session级别设置认证可以让所有请求自动携带认证信息。

代码示例

import requests
from requests.auth import AuthBase

# 自定义Token认证
class TokenAuth(AuthBase):
    """自定义Token认证方案"""
    def __init__(self, token):
        self.token = token

    def __call__(self, r):
        r.headers['X-Auth-Token'] = self.token
        return r

# 使用自定义认证
token_auth = TokenAuth('my_secret_token_abc123')
response = requests.get('https://httpbin.org/headers', auth=token_auth)
result = response.json()
print(f"自定义Token: {result['headers'].get('X-Auth-Token')}")

# Session级别认证(所有请求自动携带认证信息)
session = requests.Session()
session.auth = ('admin', 'secret123')

# Session中的所有请求自动携带认证
response2 = session.get('https://httpbin.org/basic-auth/admin/secret123')
print(f"Session认证结果: {response2.json()}")

session.close()

输出结果:

代码示例

自定义Token: my_secret_token_abc123
Session认证结果: {'authenticated': True, 'user': 'admin'}

六、认证应用场景

  • 内部API调用:使用Basic Auth传递用户名密码,访问需要身份验证的内部API

  • 第三方服务:使用自定义Token认证方案对接第三方服务

  • 企业级应用:Session级别设置认证,所有请求自动携带凭证


安全提示:Basic Auth将用户名密码Base64编码后传输(非加密),必须配合HTTPS使用。不要在代码中硬编码用户名密码,应从环境变量或配置文件中读取。认证失败返回401状态码,requests不会自动抛出异常,需手动检查。

七、认证方式对比

认证方式 安全性 实现复杂度 适用场景
Basic Auth 低(需HTTPS) 简单 简单API、内部服务
Digest Auth 旧系统兼容
Bearer Token OAuth2.0、JWT
API Key 简单 第三方API调用
自定义Auth 取决于实现 复杂 特殊认证需求

八、常见问题

Basic Auth和Digest Auth有什么区别?

Basic Auth将用户名密码Base64编码后传输,安全性较低,必须配合HTTPS使用;Digest Auth使用MD5摘要算法,密码不会直接在网络中传输,安全性更高。

如何实现Bearer Token认证?

可以通过自定义AuthBase类实现:在__call__方法中设置r.headers['Authorization'] = f'Bearer {token}'

认证失败时为什么requests不抛出异常?

401是一个正常的HTTP响应状态码,不是网络层面的错误。requests只在网络异常(连接失败、超时等)时抛出异常。认证失败需要通过response.status_code手动判断。

Session级别认证如何清除?

将session.auth设置为None即可清除Session级别的认证配置:session.auth = None,后续请求将不再携带认证信息。

标签: requests HTTP认证 BasicAuth 自定义认证 auth参数 Python网络

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: requests代理设置教程 - HTTP/SOCKS代理配置详解 下一篇: requests Cookie处理教程 - 发送接收会话管理详解

poll相关推荐