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

调用DevOps API拉取数据时出现401未授权错误的原因咨询

Azure DevOps API 401 Unauthorized 错误排查

可能的原因及解决方向

  • 令牌授权格式错误
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:33:13