使用 cURL,我们可以通过 HTTP Web 请求传递用户名,如下所示:
$ curl -u <your_username> https://api.github.com/user
该-u标志接受用户名进行身份验证,然后 cURL 将请求密码。cURL 示例用于使用 GitHub Api 进行基本身份验证。
-u
我们如何将用户名和密码与 Invoke-WebRequest 一起传递?最终目标是在 GitHub API 中使用具有基本身份验证的 PowerShell 用户。
我在这里假设基本身份验证。
$cred = Get-Credential Invoke-WebRequest -Uri 'https://whatever' -Credential $cred
您可以通过其他方式(等)获取您的凭证Import-Clixml,但它必须是一个[PSCredential]对象。
Import-Clixml
[PSCredential]
正如他们在您提供的链接中解释的那样,GitHub 正在破坏 RFC :
API 支持 RFC2617 中定义的基本身份验证,但有一些细微差别。主要区别在于 RFC 要求使用 401 Unauthorized 响应来回答未经身份验证的请求。在许多地方,这会泄露用户数据的存在。相反,GitHub API 以 404 Not Found 响应。这可能会导致假定 401 Unauthorized 响应的 HTTP 库出现问题。解决方案是手动制作 Authorization 标头。
据我所知, PowershellInvoke-WebRequest在发送凭据之前会等待 401 响应,并且由于 GitHub 从未提供过响应,因此您的凭据将永远不会被发送。
Invoke-WebRequest
相反,您必须自己创建基本的身份验证标头。
基本身份验证采用由冒号分隔的用户名和密码组成的字符串,user:pass然后发送其 Base64 编码结果。
user:pass
像这样的代码应该可以工作:
$user = 'user' $pass = 'pass' $pair = "$($user):$($pass)" $encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair)) $basicAuthValue = "Basic $encodedCreds" $Headers = @{ Authorization = $basicAuthValue } Invoke-WebRequest -Uri 'https://whatever' -Headers $Headers
您可以组合一些字符串连接,但我想将其分解以使其更清晰。