0

$(System.AccessToken)尝试使用 的值作为凭据访问 REST API 时,我得到了 401(大概) 。我正在运行的管道与我正在使用的 API URL 位于同一 ADS 2020 本地服务器上。

构建日志中的错误消息如下所示:

TF400813: 资源不可用于匿名访问。需要客户端身份验证。- Azure DevOps 服务器

受此技术的启发,以下是我的 PowerShell 内联脚本任务中的代码:

$Params = @{
  ContentType = 'application/json'
  Headers = @{ Authorization = 'Bearer $(System.AccessToken)' }
  Method = 'Get'
  Uri = 'http://host/collection/project/_apis/build/builds/' + $(Build.BuildId) + '?api-version=6.0'
}

$Result = Invoke-RestMethod @Params

我也试过这个,借用这个答案

$Params = @{
  ContentType = 'application/json'
  Method = 'Get'
  Uri = 'http://$(System.AccessToken)@host/collection/project/_apis/build/builds/' + $(Build.BuildId) + '?api-version=6.0'
}

$Result = Invoke-RestMethod @Params

我已经注意打开该Allow scripts to access the OAuth token选项,如此所述。

奇怪的是它第一次工作(上面的第一个代码块)。现在,无论我尝试什么,我总是会收到上述错误。

如何使用$(System.AccessToken)Build 任务中的值来访问同一服务器上的 REST 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
4

1 回答 1

0

经过一番苦恼,我终于找到了有效的组合:

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

$Params = @{
  ContentType = "application/json"
  Method = "Get"
  Uri = "http://host/collection/project/_apis/build/builds/$BuildId"
}

$Result = Invoke-RestMethod @Params -Headers @{ Authorization = "Bearer $Token" }

我一时兴起试了试。我不知道为什么这会通过而其他人没有,但这没关系。它运行。我在里面贴了一面旗帜。

于 2021-08-25T23:11:20.117 回答