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
相关产品推荐
相关产品推荐

