PowerShell的Invoke-RestMethod相当于curl -u(基本身份验证)

时间:2014-07-10 09:19:13

标签: powershell curl basic-authentication

等同于

curl -u username:password ...
在PowerShell' Invoke-RestMethod

?我试过这个:

$securePwd = ConvertTo-SecureString "password" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential ($username, $securePwd)

Invoke-RestMethod -Credential $credential ...

但它返回401,未经授权。

8 个答案:

答案 0 :(得分:80)

到目前为止,这是唯一对我有用的方法:

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))

Invoke-RestMethod -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} ...

但我不相信没有更好的方法。

答案 1 :(得分:14)

我不确定为什么-Credential参数在你的情况下不起作用,但它适用于httpbin service

你可以试试这个:

$pwd = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
$cred = New-Object Management.Automation.PSCredential ('PsUser', $pwd)

Invoke-RestMethod 'http://httpbin.org/basic-auth/PsUser/MyPassword' -cred $cred

编辑:如评论中所述,此方法不会在初始请求中发送授权标头。它等待质询响应,然后使用Authorization标头重新发送请求。这对于初始请求中需要凭据的服务不起作用。

答案 2 :(得分:8)

It appears you should combine methods when they fail independently.

Create the credential and add it to the request.

Create the header and add it to the request.

$username = "username";
$password = ConvertTo-SecureString –String "password" –AsPlainText -Force
$credential = New-Object –TypeName "System.Management.Automation.PSCredential" –ArgumentList $username, $password

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))

$getProjectUri = "yourUri"
Invoke-RestMethod -Method Get -Uri $getProjectUri -Headers @{Authorization = "Basic $base64AuthInfo" } -Credential $credential -ContentType "application/json"

答案 3 :(得分:3)

我发现,如果您预先创建带有凭据的WebRequestSession对象,则使用-WebSession参数是可行的。我不会重新讨论如何创建PS Credential对象,因为其他答案已经对此进行了介绍。

$WebSession = New-Object -TypeName Microsoft.PowerShell.Commands.WebRequestSession -Property @{Credentials=$Credential}
Invoke-RestMethod -Uri "your_URI" -WebSession $WebSession

这种方法在第一次调用时发送auth标头,因此避免了401响应。

顺便说一句,这种方法也可用于设置代理详细信息(使用参数指定时,代理详细信息在PS的所有版本中均无法正常工作),并在您的API要求时处理cookie。

答案 4 :(得分:2)

此版本适用于Get-Credential的{​​{1}}个对象。它还可以在PowerShell 6.0中跨平台工作。它通过避免使用BSTR调用来实现这一点,有时在尝试从PSCredential中提取密码时会建议这样做。

PSCredential

答案 5 :(得分:0)

您基本上需要将用户名和密码对作为已编码的凭据变量传递给Invoke-RestMethod

对我有用的是:

$USERNAME = 'user'
$PASSWORD = 'password'
$IDP_URL = 'example.com/token'


$credPair = "$($USERNAME):$($PASSWORD)"
$encodedCredentials = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($credPair))

$parameters = @{
    Uri         = $IDP_URL
    Headers     = @{ 'Authorization' = "Basic $encodedCredentials" }
    Method      = 'POST'
    Body        = '...'
    ContentType = '...'
}

Invoke-RestMethod @parameters

请注意如何将请求参数提取到$parameters中,以免使命令膨胀。

答案 6 :(得分:0)

#Requires -Version 6
$Uri = 'https://httpbin.org/basic-auth/user/pass'
$Credential = Get-Credential
Invoke-RestMethod -Uri $Uri -Authentication Basic -Credential $Credential

答案 7 :(得分:0)

我知道这是一个非常老的问题,但是我想在某个地方分享更新。我在使用PowerShell进行基本身份验证时找不到的帖子对我有用。经过反复试验并仔细阅读了MS Docs,我发现我需要使用-AllowUnencryptedAuthentication参数,因为我使用的是http连接。我还必须升级PS版本才能访问该参数。

根据参数的说明:“允许通过未加密的连接发送凭据和机密。默认情况下,提供凭据或任何不以https://开头的Uri的身份验证选项将导致错误和请求将中止操作,以防止通过未加密的连接无意间传递纯文本中的机密。要覆盖此行为,请您自担风险,请提供AllowUnencryptedAuthentication参数。“