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

wb1gzix0  于 2023-01-09  发布在  Shell
关注(0)|答案(9)|浏览(191)

什么是等价的

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,未授权。

oprakyz7

oprakyz71#

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

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

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

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

xfb7svmp

xfb7svmp2#

我不知道为什么-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标头。它会等待质询响应,然后重新发送具有Authorization标头的请求。这对于在初始请求时需要凭据的服务不起作用。
pnwntuvh

pnwntuvh3#

当方法单独失败时,似乎应该将它们合并起来。
创建凭据并将其添加到请求中。
创建标头并将其添加到请求中。

$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"
l5tcr1uw

l5tcr1uw4#

#Requires -Version 6
$Uri = 'https://httpbin.org/basic-auth/user/pass'
# use "user" and "pass" when prompted for credentials
$Credential = Get-Credential
Invoke-RestMethod -Uri $Uri -Authentication Basic -Credential $Credential
laximzn5

laximzn55#

此版本使用Get-CredentialPSCredential对象。它还可以在PowerShell 6.0中跨平台工作。它通过避免使用BSTR调用来做到这一点,当尝试从PSCredential提取密码时,有时会建议使用BSTR调用。

$creds = Get-Credential
$unsecureCreds = $creds.GetNetworkCredential()
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $unsecureCreds.UserName,$unsecureCreds.Password)))
Remove-Variable unsecureCreds

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

hts6caw36#

我发现如果你预先创建了一个带凭据的WebRequestSession对象,使用-WebSession参数是可行的,我不会重复如何创建PS凭据对象,因为这已经在其他答案中涉及到了。

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

这种方法在第一次调用时发送auth报头,因此避免了401响应。
顺便说一句,这种方法也可以用于设置代理详细信息(当使用参数指定时,并不是所有版本的PS都能正常工作),并在API需要时处理cookie。

hxzsmxv2

hxzsmxv27#

您基本上需要将用户名和密码对作为编码的凭证变量传递给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中以避免命令膨胀。

wlp8pajw

wlp8pajw8#

我知道这是一个很老的问题,但我想在某个地方分享一个更新。我找到的关于使用PowerShell进行基本身份验证的帖子没有一个适合我。经过多次反复试验和阅读MS文档后,我发现我需要使用-AllowUnencryptedAuthentication参数,因为我使用http连接。我还必须升级PS版本才能访问该参数。
根据参数的说明:允许通过未加密的连接发送凭据和机密。默认情况下,为Credential或任何Authentication选项提供不以https://开始的URI将导致错误,请求将中止,以防止无意中通过未加密的连接以纯文本形式传递机密。若要覆盖此行为,请提供AllowUnencryptedAuthentication参数,风险自负。

ssm49v7z

ssm49v7z9#

我花了几天的时间没有任何运气与上述例子。最终我工作了我需要指定的方法后。例如:

$request =  Invoke-WebRequest -Method Post -Uri "https://www.emea-api.morningstar.com/token/oauth" -Headers @{accept='*/*';Authorization='Basic bWFy...encoded username:password...='};
  • 莫贝利

相关问题