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.
Ответы
Ответ 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