等同于
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,未经授权。
答案 0 :(得分:80)
到目前为止,这是唯一对我有用的方法:
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))
Invoke-RestMethod -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} ...
但我不相信没有更好的方法。
答案 1 :(得分:14)
我不确定为什么但它适用于httpbin service。-Credential
参数在你的情况下不起作用,
你可以试试这个:
$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参数。“