Подтвердить что ты не робот

PowerShell Invoke-RestMethod эквивалент curl -u (базовая аутентификация)

Что эквивалентно

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, Unauthorized.

4b9b3361

Ответ 1

Это единственный метод, который работал у меня до сих пор:

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

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

Но я не верю, что нет лучшего способа.

Ответ 2

Я не уверен, почему параметр -Credential не работает в вашем случае, но он работает с httpbin сервис.

Вы можете попробовать следующее:

$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

Изменить: Как отмечено в комментариях, этот метод не будет отправлять заголовок авторизации в исходный запрос. Он ожидает ответа на вызов, а затем повторно отправляет запрос с заголовком авторизации. Это не будет работать для служб, для которых требуются учетные данные для первоначального запроса.

Ответ 3

Похоже, вы должны комбинировать методы, когда они выходят из строя независимо.

Создайте учетные данные и добавьте их в запрос.

Создайте заголовок и добавьте его в запрос.

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

Ответ 4

Я обнаружил, что использование параметра -WebSession работает, если вы предварительно создали объект WebRequestSession с учетными данными. Я не буду перефразировать, как создать объект PS Credential, поскольку это уже было рассмотрено в других ответах.

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

Этот подход отправляет заголовок auth при первом вызове, поэтому избегает ответа 401.

Кстати, этот подход также можно использовать для установки сведений о прокси (которые не работают должным образом во всех версиях PS, если они указаны с использованием параметров) и обрабатывает файлы cookie, если этого требует ваш API.

Ответ 5

Эта версия работает с объектом Get-Credential PSCredential. Он также работает кросс-платформенной в PowerShell 6.0. Он делает это, избегая использования вызовов BSTR, которые иногда предлагаются при попытке извлечь пароль из PSCredential.

$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)} ...

Ответ 6

В основном вам нужно передать пару имени пользователя и пароля в 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 чтобы избежать раздувания вашей команды.

Ответ 7

#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