Azure DevOps 的 Powershell Invoke-RestMethod 未使用 PAT 进行身份验证
Powershell Invoke-RestMethod not authenticated with PAT for Azure DevOps
我正在尝试调用我们的 Azure DevOps 项目的 REST API,我得到了一些我不期望的结果。
我可以使用 LinqPad 获得结果,但使用 Powershell 失败。
我的脚本
$env:Build_BuildId = 2468
$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes("myPAT"))
$env:System_TeamProject = "myProject"
$url = "https://dev.azure.com/myorg/$env:System_TeamProject/_apis/build/builds/$env:Build_BuildId/changes?api-version=5.0"
$response = Invoke-RestMethod -Uri $url -Method Get -ContentType "application/json" -Headers @{
Authorization = "Basic $token"
}
Write-Host $response
回应
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en-US">
<head><title>
Azure DevOps Services | Sign In
</title><meta http-equiv="X-UA-Compatible" content="IE=11; IE=10; IE=9; IE=8" />
<link rel="SHORTCUT ICON" href="/favicon.ico"/>
<link data-bundlelength="508485" data-bundlename="commoncss" data-highcontrast="/_static/tfs/M154_20190628.18/_cssbundles/HighContrast/vss-bundle-commoncss-vAEI_yKFIiS9jTVmCtAOiwe4cLPqdXnp6QCUVseU7jzk=" data-includedstyles="jQueryUI-Modified;Core;Splitter;PivotView" href="/_static/tfs/M154_20190628.18/_cssbundles/Default/vss-bundle-commoncss-vqjKBNZxfVQkGGn0rrvF7eh9DJDj__wqtFN85fVrIQn8=" rel="stylesheet" />
<link data-bundlelength="116162" data-bundlename="viewcss" data-highcontrast="/_static/tfs/M154_20190628.18/_cssbundles/HighContrast/vss-bundle-viewcss-v356iHjTFccxhkNidRJIEefQ92VqpWpa7rO4mdtAnDpM=" data-includedstyles="VSS.Controls" href="/_static/tfs/M154_20190628.18/_cssbundles/Default/vss-bundle-viewcss-vXHgBtK2hntEJYzWnMNhcJkJC-nUhp2m3BtF-jVlzOZA=" rel="stylesheet" />
... etc. etc.
我想请求会得到一个响应,该响应将由浏览器呈现为 azure devops 的登录登录页面。
我对我的 PAT 进行了两次和三次检查,甚至创建了一些新的完全访问版本,但行为没有任何变化。
最终这个脚本将 运行 在托管代理上,所以我最后不太担心这个,但我不想 运行 测试管道如果我不需要脚本。
$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes("myPAT"))
不正确。 myPAT
应该有一个前导冒号。
例如:
$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":myPAT"))
对于使用 powershell、azure devops 并获得 azure devops 登录 html 响应/return 的任何人,这是一个有效的解决方案 -
(注意:您可以将 projectId 替换为项目名称,将 repoId 替换为 repo 名称)
$personalToken = "your pat token"
$patToken = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($personalToken)"))
$repoHeader = @{"Authorization"="Basic $patToken"}
Write-Output $repoHeader
$projectId = "your project id here"
$repoId = "your repo id here"
$orgName = "your org name here"
$repoUrl = [string]::Format("https://dev.azure.com/{0}/{1}/_apis/git/repositories/{2}/refs?api-version=6.0", $orgName, $projectId, $repoId)
Write-Output $repoUrl
$output = Invoke-RestMethod -Uri $repoUrl -Method Get -ContentType "application/json; charset=utf-8; api-version=6.0" -Headers $repoHeader -MaximumRedirection 10
Write-Output $output
foreach ($outputValue in $output.value)
{
Write-Output $outputValue.name
Write-Output "Hi"
}
我正在尝试调用我们的 Azure DevOps 项目的 REST API,我得到了一些我不期望的结果。
我可以使用 LinqPad 获得结果,但使用 Powershell 失败。
我的脚本
$env:Build_BuildId = 2468
$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes("myPAT"))
$env:System_TeamProject = "myProject"
$url = "https://dev.azure.com/myorg/$env:System_TeamProject/_apis/build/builds/$env:Build_BuildId/changes?api-version=5.0"
$response = Invoke-RestMethod -Uri $url -Method Get -ContentType "application/json" -Headers @{
Authorization = "Basic $token"
}
Write-Host $response
回应
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en-US">
<head><title>
Azure DevOps Services | Sign In
</title><meta http-equiv="X-UA-Compatible" content="IE=11; IE=10; IE=9; IE=8" />
<link rel="SHORTCUT ICON" href="/favicon.ico"/>
<link data-bundlelength="508485" data-bundlename="commoncss" data-highcontrast="/_static/tfs/M154_20190628.18/_cssbundles/HighContrast/vss-bundle-commoncss-vAEI_yKFIiS9jTVmCtAOiwe4cLPqdXnp6QCUVseU7jzk=" data-includedstyles="jQueryUI-Modified;Core;Splitter;PivotView" href="/_static/tfs/M154_20190628.18/_cssbundles/Default/vss-bundle-commoncss-vqjKBNZxfVQkGGn0rrvF7eh9DJDj__wqtFN85fVrIQn8=" rel="stylesheet" />
<link data-bundlelength="116162" data-bundlename="viewcss" data-highcontrast="/_static/tfs/M154_20190628.18/_cssbundles/HighContrast/vss-bundle-viewcss-v356iHjTFccxhkNidRJIEefQ92VqpWpa7rO4mdtAnDpM=" data-includedstyles="VSS.Controls" href="/_static/tfs/M154_20190628.18/_cssbundles/Default/vss-bundle-viewcss-vXHgBtK2hntEJYzWnMNhcJkJC-nUhp2m3BtF-jVlzOZA=" rel="stylesheet" />
... etc. etc.
我想请求会得到一个响应,该响应将由浏览器呈现为 azure devops 的登录登录页面。
我对我的 PAT 进行了两次和三次检查,甚至创建了一些新的完全访问版本,但行为没有任何变化。
最终这个脚本将 运行 在托管代理上,所以我最后不太担心这个,但我不想 运行 测试管道如果我不需要脚本。
$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes("myPAT"))
不正确。 myPAT
应该有一个前导冒号。
例如:
$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":myPAT"))
对于使用 powershell、azure devops 并获得 azure devops 登录 html 响应/return 的任何人,这是一个有效的解决方案 -
(注意:您可以将 projectId 替换为项目名称,将 repoId 替换为 repo 名称)
$personalToken = "your pat token"
$patToken = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($personalToken)"))
$repoHeader = @{"Authorization"="Basic $patToken"}
Write-Output $repoHeader
$projectId = "your project id here"
$repoId = "your repo id here"
$orgName = "your org name here"
$repoUrl = [string]::Format("https://dev.azure.com/{0}/{1}/_apis/git/repositories/{2}/refs?api-version=6.0", $orgName, $projectId, $repoId)
Write-Output $repoUrl
$output = Invoke-RestMethod -Uri $repoUrl -Method Get -ContentType "application/json; charset=utf-8; api-version=6.0" -Headers $repoHeader -MaximumRedirection 10
Write-Output $output
foreach ($outputValue in $output.value)
{
Write-Output $outputValue.name
Write-Output "Hi"
}