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

Azure DevOps 2020构建任务用$(System.AccessToken)调用REST API报401错误

修复方案


1. 修正PowerShell变量展开语法错误

你使用环境变量的版本存在最直接的语法问题:PowerShell 中单引号包裹的内容不会解析内部变量,你写的Headers = @{ Authorization = 'Bearer $Token' }实际发送到服务端的请求头是字面量Bearer $Token,没有传入真实的令牌值,自然会认证失败。
修复方式是将单引号替换为双引号即可:

Headers = @{ Authorization = "Bearer $Token" }

2. 优先使用环境变量读取令牌,避免宏替换异常

你前两个版本直接在代码中使用$(System.AccessToken)这类流水线宏变量,仅在纯内联脚本场景下会被正常替换,如果你后续调整了脚本运行方式(比如改为调用独立.ps1文件)、或者修改了代理作业配置导致宏替换功能被关闭,令牌就会被识别为普通字符串导致认证失败。
本地ADS 2020会自动将System.AccessToken注入为环境变量SYSTEM_ACCESSTOKEN,Build.BuildId注入为BUILD_BUILDID,统一用环境变量读取是兼容性最高的方式。

3. 避免使用URL传递令牌的兼容问题

你第二个版本将令牌直接放在URL的身份位,属于HTTP基本认证的变体,本地部署的ADS默认会禁用这种不安全的传参方式,如果你配置了HTTPS强制策略,明文HTTP传输令牌还会被直接拦截返回401,这种写法不建议使用。

额外排查点

如果修正语法后仍有报错,可以检查两个配置项:

  • 确认对应代理作业的Allow scripts to access the OAuth token开关处于开启状态:如果你修改过流水线的代理作业配置,这个开关会被自动重置为关闭,需要重新勾选并保存流水线。
  • 检查构建服务账户权限:如果后续管理员调整过项目权限,需要给Project Build Service (你的项目名)账户授予对应API资源的访问权限,比如查询构建信息需要授予构建读取权限。

最终可用代码示例

$BuildId = $env:BUILD_BUILDID
$Token = $env:SYSTEM_ACCESSTOKEN

$Params = @{
  ContentType = 'application/json'
  Headers = @{ Authorization = "Bearer $Token" }
  Method = 'Get'
  Uri = "http://host/collection/project/_apis/build/builds/$BuildId`?api-version=6.0"
}

$Result = Invoke-RestMethod @Params

内容的提问来源于stack exchange,提问作者InteXX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:42:03