Powershell http post REST API базовая аутентификация
У меня есть базовая аутентификация, работающая с REST API с помощью curl:
curl -X POST -H 'Accept: application/json' -u user:password http://localhost/test/
Но когда я пытаюсь сделать то же самое с powershell webRequest, я получаю 403 (разрешение отклонено).
Этот script отлично работает, когда я отключу проверку подлинности в коде REST.
Каким образом в PowerShell можно передать учетные данные по запросу POST, подобному завиту, или что я могу сделать, чтобы исправить следующее script.
По-настоящему оценил бы некоторые рекомендации по этому поводу. Спасибо.
Вот моя powershell script:
function Execute-HTTPPostCommand() {
param(
[string] $target = $null
)
$username = "user"
$password = "pass"
$webRequest = [System.Net.WebRequest]::Create($target)
$webRequest.ContentType = "text/html"
$PostStr = [System.Text.Encoding]::UTF8.GetBytes($Post)
$webrequest.ContentLength = $PostStr.Length
$webRequest.ServicePoint.Expect100Continue = $false
$webRequest.Credentials = New-Object System.Net.NetworkCredential -ArgumentList $username, $password
$webRequest.PreAuthenticate = $true
$webRequest.Method = "POST"
$requestStream = $webRequest.GetRequestStream()
$requestStream.Write($PostStr, 0,$PostStr.length)
v$requestStream.Close()
[System.Net.WebResponse] $resp = $webRequest.GetResponse();
$rs = $resp.GetResponseStream();
[System.IO.StreamReader] $sr = New-Object System.IO.StreamReader -argumentList $rs;
[string] $results = $sr.ReadToEnd();
return $results;
}
$post = "volume=6001F930010310000195000200000000&arrayendpoint=2000001F930010A4&hostendpoint=100000051ED4469C&lun=2"
$URL = "http://example.com/test/"
Execute-HTTPPostCommand $URL
Ответы
Ответ 1
Ваш код выглядит хорошо, я бы попробовал добавить заголовок HTTP_AUTHORIZATION для $webrequest следующим образом:
$webRequest.Headers.Add("AUTHORIZATION", "Basic YTph");
Где YTph будет base64encoded string для имени пользователя: password.
Ответ 2
Я знаю, что это старый поток, но для тех, кто может споткнуться об этом, invoke-restmethod - это намного лучший и простой механизм для вызова API с помощью PowerShell.
Создайте список параметров как хэш-таблицу:
$params = @{uri = 'https:/api.trello.com/1/TheRestOfYourURIpath';
Method = 'Get'; #(or POST, or whatever)
Headers = @{Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$($acctname):$($password)"));
} #end headers hash table
} #end $params hash table
$var = invoke-restmethod @params
Таблица параметров хэша может немного отличаться.
На самом деле я не работал с Trello, но у меня с GitHub, Serena Business Manager и Jira.
Ответ 3
Свойство Credentials, похоже, используется для проверки подлинности Windows. Попробуйте использовать эту функцию:
Принудительная проверка подлинности в WebRequest
Я бы посоветовал вам в любом случае использовать некоторый веб-отладчик, например, Fiddler, чтобы увидеть разницу между запросом на завивки и вашим запросом.
Ответ 4
Это код, который я использую для загрузки страниц из Confluence в виде HTML файлов.
$pageid = "176398584" ;
$url = "http://wikiserver/wiki/pages/viewpage.action?pageId=$pageid" ;
write-host "Establish credentials" ;
$r = Invoke-WebRequest "http://wikiserver/wiki/pages/login.action" -SessionVariable my_session ;
# $r ;
$form = $r.Forms[1];
# $form ;
# $c = $host.UI.PromptForCredential('Your Credentials', 'Enter Credentials', '', '') ;
# $form.fields['os_username'] = $c.UserName ;
# $form.fields['os_password'] = $c.GetNetworkCredential().Password ;
$form.fields['os_username'] = "mywikirobotlogonname" ;
$form.fields['os_password'] = "mywikirobotpassword" ;
$form.fields['os_cookie'] = "true" ;
$form.fields['os_destination'] = "%2Fpages%2Fviewpage.action%3FpageId%3D$pageid" ;
$outputFile = "$pageid.html" ;
$content = Invoke-WebRequest -Uri ($url + $form.Action) -WebSession $my_session -Method POST -Body $form.Fields ;
$content.ParsedHTML.getElementById("content").innerHTML | Add-Content $outputFile
Пользовательский интерфейс хоста может использоваться, чтобы попросить пользователя ввести свою регистрационную информацию.
Раскомментировать переменную, отображаемую для системы, выводит содержимое формы, извлеченной страницы и т.д. для устранения неполадок- $r $form $content