在构建任务中使用 $(System.AccessToken) 调用 RestMethod 时出错 运行
Error running Invoke-RestMethod with $(System.AccessToken) in a build task
我在尝试使用 $(System.AccessToken)
的值作为凭据访问 REST API 时收到 401(大概)。我 运行 的管道与我正在使用的 API URL 在同一个 ADS 2020 本地服务器上。
构建日志中的错误消息如下:
TF400813: Resource not available for anonymous access. Client authentication required. - Azure DevOps Server
受到 this technique 的启发,这是我的 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
选项,如记录 here。
奇怪的是它第一次通过(上面的第一个代码块)。现在,无论我尝试什么,我总是会收到上述错误。
如何在构建任务中使用 $(System.AccessToken)
的值来访问同一服务器上的 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
苦苦思索后,我终于找到了有效的组合:
$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" }
心血来潮试了一下。我不知道为什么这会通过而其他人不会,但没关系。它运行。我在里面贴了一面旗帜。
我在尝试使用 $(System.AccessToken)
的值作为凭据访问 REST API 时收到 401(大概)。我 运行 的管道与我正在使用的 API URL 在同一个 ADS 2020 本地服务器上。
构建日志中的错误消息如下:
TF400813: Resource not available for anonymous access. Client authentication required. - Azure DevOps Server
受到 this technique 的启发,这是我的 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
选项,如记录 here。
奇怪的是它第一次通过(上面的第一个代码块)。现在,无论我尝试什么,我总是会收到上述错误。
如何在构建任务中使用 $(System.AccessToken)
的值来访问同一服务器上的 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
苦苦思索后,我终于找到了有效的组合:
$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" }
心血来潮试了一下。我不知道为什么这会通过而其他人不会,但没关系。它运行。我在里面贴了一面旗帜。