小编典典

在 GitHub API 上使用带有用户名和密码的 Invoke-WebRequest 进行基本身份验证

all

使用 cURL,我们可以通过 HTTP Web 请求传递用户名,如下所示:

$ curl -u <your_username> https://api.github.com/user

-u标志接受用户名进行身份验证,然后 cURL 将请求密码。cURL 示例用于使用 GitHub Api
进行基本身份验证

我们如何将用户名和密码与 Invoke-WebRequest 一起传递?最终目标是在 GitHub API 中使用具有基本身份验证的 PowerShell
用户。


阅读 111

收藏
2022-08-27

共1个答案

小编典典

我在这里假设基本身份验证。

$cred = Get-Credential
Invoke-WebRequest -Uri 'https://whatever' -Credential $cred

您可以通过其他方式(等)获取您的凭证Import-Clixml,但它必须是一个[PSCredential]对象。

根据评论编辑:

正如他们在您提供的链接中解释的那样,GitHub 正在破坏 RFC :

API 支持 RFC2617 中定义的基本身份验证,但有一些细微差别。主要区别在于 RFC 要求使用 401 Unauthorized
响应来回答未经身份验证的请求。在许多地方,这会泄露用户数据的存在。相反,GitHub API 以 404 Not Found 响应。这可能会导致假定
401 Unauthorized 响应的 HTTP 库出现问题。解决方案是手动制作 Authorization 标头。

据我所知, PowershellInvoke-WebRequest在发送凭据之前会等待 401 响应,并且由于 GitHub
从未提供过响应,因此您的凭据将永远不会被发送。

手动构建标题

相反,您必须自己创建基本的身份验证标头。

基本身份验证采用由冒号分隔的用户名和密码组成的字符串,user:pass然后发送其 Base64 编码结果。

像这样的代码应该可以工作:

$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

您可以组合一些字符串连接,但我想将其分解以使其更清晰。

2022-08-27