相同参数下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
相关产品推荐
相关产品推荐

