You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

相同参数下Python Requests认证失败,curl子进程却可正常运行

问题分析与解决

你的问题核心在于错误地对HTTP Basic Auth的用户名做了URL编码,同时存在cookie设置与curl不一致的细节问题,具体拆解和修复如下:

1. 认证失败的根本原因

HTTP Basic Auth的规范是:将用户名:密码的字符串做Base64编码后放入Authorization请求头,这个过程不需要对用户名做URL编码。

你用urllib.parse.quote(self.username)把含@的用户名转成了marcel%40mydomain.com这类编码格式,传给HTTPBasicAuth后,requests会基于这个编码后的字符串生成Authorization头,服务器拿到的是编码后的用户名,自然匹配不上原始的用户名,因此返回Authentication required错误。

而curl中把编码后的用户名放在URL里时,服务器会自动解析URL并解码出原始用户名,所以能正常完成认证。

2. 修复步骤

(1)修正认证逻辑

去掉用户名的URL编码,直接传入原始用户名:

auth = requests.auth.HTTPBasicAuth(self.username, self.token)
response = requests.get(
    f"https://{url}",
    verify=True,
    allow_redirects=True,
    cert=self.cert,
    cookies={"test": ""},  # 和curl的cookie设置保持一致
    auth=auth
)

(2)对齐cookie设置

你curl里的--cookie "test"对应的是cookie键为test,值为空字符串,而之前requests里的{"test": "test"}是值为test,这是潜在的差异点,需要改成{"test": ""}和curl保持一致。

3. 验证逻辑

修改后,requests生成的Authorization头会和curl的逻辑完全对齐:

  • curl从URL解析出解码后的用户名,生成正确的Base64编码头
  • requests直接用原始用户名生成正确的Base64编码头

服务器就能正确识别你的认证信息了。

内容的提问来源于stack exchange,提问作者Marcel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:25:10