调用DevOps API拉取数据时出现401未授权错误的原因咨询
可能的原因及解决方向
令牌授权格式错误
Azure DevOps的个人访问令牌(PAT)不适用Bearer前缀,正确的做法是将{任意用户名}:{PAT}进行Base64编码,然后使用Basic前缀作为授权头。其中用户名可以填任意值甚至空字符串,但必须保留冒号分隔。你的代码中误用了OAuth令牌的Bearer格式,这是导致401的常见原因。请求URL包含无效空格
你代码中的URL在?后存在多余空格:WorkItems? $top=10,这会导致服务器无法正确解析请求路径,进而返回权限错误。需要删除空格,修正为WorkItems?$top=10。PAT权限范围不匹配
即使你认为权限完全,仍需确认PAT是否勾选了Analytics Read权限(因为调用的是Analytics API)。创建PAT时若漏选对应API的权限,会直接导致请求被拒绝。令牌过期或被撤销
检查PAT的有效期是否已过,或者是否在Azure DevOps后台被意外撤销。可以重新生成一个新的PAT进行测试,排除过期或失效问题。冗余请求头干扰
GET请求通常无需Content-Type头,虽然这一般不会直接引发401,但可以尝试移除该头,避免潜在的兼容性问题。
修正后的示例代码
from flask import Flask, jsonify import requests import base64 app = Flask(__name__) @app.route("/odata", methods=["GET"]) def main(): pat = 'my-token-is-here' # 对PAT进行Base64编码,用户名留空仅保留冒号 auth_encoded = base64.b64encode(f":{pat}".encode('utf-8')).decode('utf-8') headers = { 'Authorization': f"Basic {auth_encoded}" } # 修正后的URL,移除多余空格 url = "https://analytics.dev.azure.com/krisn916/newProject/_odata/v4.0-preview/WorkItems?$top=10" response = requests.get(url, headers=headers) if response.status_code == 200: user_data = response.json() return jsonify(user_data), 200 return jsonify({ "error": "Failed to fetch user data", "status_code": response.status_code }), response.status_code if __name__ == "__main__": app.run(debug=True)
内容的提问来源于stack exchange,提问作者kris
相关产品推荐
相关产品推荐

