为什么我的powershell Base64字符串被截断为36个字符?

时间:2018-05-15 08:25:21

标签: powershell azure-pipelines-build-task azure-devops-rest-api

我在VSTS Build中使用PowerShell来查询VSTS API。我使用PAT进行身份验证。

但是,当我生成Auth字符串时,我发现它失败了。这是我的代码

    $VstsAccessEmail = $Env:VstsAccessEmail 
    $VstsAccessToken = $Env:VstsAccessToken
    $pair = "${VstsAccessEmail}:${VstsAccessToken}"
    $base64 = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($pair))
    Write-Host $base64 

如果我在这里看到结果,我会看到实际身份验证字符串的前36个字符。我在我的机器上使用Powershell生成了字符串,我得到了整个108个字符。我已经对此进行了硬编码,以便按照以上代码执行以下步骤进行测试。

    $base641 = "a2FuZ2thbi5nb3N3YW1pQHVuaXN5cy5jb206cHh4b25oaHBlNmtjb3g3aTRhdHZxMzdoNms2ZnpuNHhyaWhyZ2ozdGZ3ejRlNmxxxxXXXX=="
    if($base64.length -ne 108){
        $base64 = $base641
    }
    Write-Host "base64 is: $base64 "

这可以正常工作。最初,我认为写入主机可能是一个问题。但是,如果我调用RestMethod而不使用硬编码更新,我会获得401 Unauthorized。

请帮忙。

更新

我发现了这个问题。我将VstsAccessToken设置为构建变量中的秘密。所以这个价值并没有通过。使其无担保工作正常。

有人可以帮助如何将令牌保密吗?

解决

使用$ Env:变量不允许在变量为secret时使用该值。但是,将它作为参数传递给PowerShell让代码读取它,尽管屏蔽输出被屏蔽。

2 个答案:

答案 0 :(得分:0)

这部分肯定是错的。我看到一件事肯定是错的,另一件事可能是错的。

$VstsAccessEmail = $Env:VstsAccessEmail 
$VstsAccessToken = $Env:VstsAccessToken
$pair = "${VstsAccessEmail}:${VstsAccessToken}"
$base64 = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($pair))
  1. $pair = "${VstsAccessEmail}:${VstsAccessToken}"应为$pair = ":${VstsAccessToken}"。不需要电子邮件地址,只需冒号,然后是身份验证令牌。

  2. UTF8.GetBytes 可能错了。我总是使用ASCII.GetBytes

答案 1 :(得分:0)

使用$ Env:变量不允许在变量为secret时使用该值。但是,将它作为参数传递给PowerShell让代码读取它,尽管屏蔽输出被屏蔽。