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
内置认证类
三、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和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,后续请求将不再携带认证信息。
本文涉及AI创作
内容由AI创作,请仔细甄别