切换API网站至HTTPS后出现401授权错误,该如何排查?
问题排查与解决方案
仅将请求地址从HTTP改为HTTPS本身不需要修改Authorization请求头的格式,但出现401错误通常和以下几个隐藏因素有关,逐一排查即可:
1. 重定向过程中授权头丢失
如果原HTTP地址存在自动重定向到HTTPS的逻辑,即便你直接修改了请求地址为HTTPS,部分服务器仍会触发重定向。而requests默认在301/302重定向时,不会将Authorization头携带到新的请求中,导致服务器无法验证权限。
解决方法:禁用自动重定向,手动处理重定向并携带授权头:
def fetchAPIList(): try: # 先禁用自动重定向 response = requests.get("https://website/api/list", headers={"Authorization": f'Bearer {key}'}, allow_redirects=False) # 若触发重定向,手动发起新请求并携带授权头 if response.status_code in [301, 302]: response = requests.get(response.headers['Location'], headers={"Authorization": f'Bearer {key}'}) return response.json() except Exception as e: print(e) raise e
2. 服务器端授权配置变更
切换HTTPS后,服务器可能同步更新了授权验证规则:
- 原授权密钥仅允许HTTP协议访问,需重新生成适配HTTPS环境的密钥;
- 服务器修改了授权头的名称(比如从
Authorization改为X-Auth-Token); - 新增了其他必须的请求头(如
X-Forwarded-Proto来标识协议类型)。
解决方法:检查API服务器的配置文档或联系运维人员,确认HTTPS环境下的授权规则是否变化。
3. 证书验证的间接影响
如果服务器使用自签名证书,requests默认会严格验证证书有效性,验证失败可能引发异常,但部分场景下会间接导致请求逻辑异常,表现为401错误。
排查方法:临时关闭证书验证(仅用于测试,生产环境禁止):
def fetchAPIList(): try: response = requests.get("https://website/api/list", headers={"Authorization": f'Bearer {key}'}, verify=False) return response.json() except Exception as e: print(e) raise e
若关闭验证后请求正常,说明需配置正确的CA证书路径:
# 替换为实际的CA证书文件路径 response = requests.get(url, headers=headers, verify="/path/to/your/ca.crt")
4. 查看请求细节定位差异
通过打印请求日志,对比HTTPS请求与原HTTP请求的头信息、响应细节,找出差异点:
import requests import logging # 开启DEBUG日志,查看完整请求/响应内容 logging.basicConfig(level=logging.DEBUG) def fetchAPIList(): try: session = requests.Session() response = session.get("https://website/api/list", headers={"Authorization": f'Bearer {key}'}) return response.json() except Exception as e: print(e) raise e
内容的提问来源于stack exchange,提问作者DrunkenPipeBomb




