使用Python通过PAT向Azure DevOps发Get请求遇203错误求助
你遇到的203问题大概率是认证方式的细节错误,或者请求头缺少必要字段导致的,结合你描述的场景,我整理了几个关键排查点:
1. Bearer Token方式的误区:PAT不能直接用Bearer认证
Azure DevOps的REST API中,Bearer认证是给OAuth2访问令牌用的,而你的Personal Access Token (PAT) 并不属于这个范畴。如果你硬把PAT放在Authorization: Bearer <PAT>里,服务器会识别为无效认证,返回非授权的203响应——这是最常见的错误点。
2. Basic认证的正确编码方式
当使用PAT做Basic认证时,必须遵循这个规则:
- 用户名可以是空字符串(或者任意字符串,Azure DevOps会忽略),密码是你的PAT
- 格式必须是
{username}:{PAT},然后对这个字符串做Base64编码 - 注意:即使你用空用户名,前面的冒号
:也不能省略!
举个正确的Python代码示例:
import requests import base64 pat = "your_pat_here" # 关键:空用户名+冒号+PAT auth_str = f":{pat}" auth_bytes = auth_str.encode("utf-8") base64_auth = base64.b64encode(auth_bytes).decode("utf-8") url = "your_azure_devops_api_url" headers = { "Authorization": f"Basic {base64_auth}", "Content-Type": "application/json" # 根据API需求添加,部分接口需要该字段 } response = requests.get(url, headers=headers) print(response.status_code) print(response.text)
很多人会忘记加前面的冒号,直接对PAT本身编码,这会导致认证失败,返回203。
3. 检查User-Agent请求头
有些Azure DevOps环境会对请求的User-Agent做校验,requests库默认的User-Agent是python-requests/x.x.x,可能被服务器识别为非浏览器请求而返回异常。你可以模拟浏览器的User-Agent试试:
在headers里添加:
headers = { # ... 其他已配置的请求头 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" }
4. 排查代理或网络环境问题
如果你的浏览器是通过代理访问Azure DevOps的,但requests请求没有配置代理,也可能导致服务器返回203(比如代理服务器返回了非授权的中转信息)。可以在requests中添加代理配置:
proxies = { "http": "http://your-proxy:port", "https": "https://your-proxy:port" } response = requests.get(url, headers=headers, proxies=proxies)
5. 确认PAT的权限范围
虽然你说浏览器能访问,但浏览器用的是你登录账号的权限,而PAT的权限可能不足。检查你的PAT是否包含了目标API所需的权限(比如读取文件的权限),可以在Azure DevOps的PAT管理页面重新编辑权限范围。
按照上面的步骤排查,尤其是前两点,应该能解决203的问题。
内容的提问来源于stack exchange,提问作者d2907

