【问题标题】:Why is my powershell Base64 String truncated to 36 characters?为什么我的 powershell Base64 字符串被截断为 36 个字符?
【发布时间】:2018-10-25 00:20:30
【问题描述】:

我在 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:variable 不允许在变量为机密时使用该值。然而,将它作为参数传递给 PowerShell 让代码可以读取它,尽管日志的输出被屏蔽了。

【问题讨论】:

  • 我认为您的问题在于您如何定义要编码的字符串。花括号有什么用? "${VstsAccessEmail}:${VstsAccessToken}"。试试这个:"$VstsAccessEmail`:$VstsAccessToken" - 注意冒号前的反引号。如果这没有帮助,请查看 $pair 中最初定义的值,以确保它符合您的预期。
  • @boxdog 建议的更改没有任何效果。我仍然看到相同的结果。
  • 您是否检查过$pair 的填充是否正确?可能环境变量设置不正确。也可能值得扭转您得到的错误编码以查看实际编码的内容 - 我不确定您输入中的任何特殊字符是否会导致问题。
  • 如果配对的形成出现错误,结果会有所不同。 base64 字符串的结果与前 36 个字符相同。我相信,这是由环境层面的某些东西引起的。
  • 这取决于$pair的值,$pair的值是多少?通过输出它(Write-Host)来检查它。

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


【解决方案1】:

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

$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

【讨论】:

  • 谢谢。如果我提供电子邮件地址,则不会导致任何错误。我试过了,就像在代码中一样,我对手动生成的 base64 密钥进行了硬编码,它工作正常。我的问题是关于如何在该代码中获取完整的密钥。 UTF8 和 ASCII 给出相同的结果。而且 UTF8 总是更好的选择。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 2015-07-31
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多