Базовая аутентификация REST API для PowerShell http post - PullRequest
20 голосов
/ 19 января 2012

У меня есть базовая аутентификация, работающая с REST API с использованием curl:

curl -X POST  -H 'Accept: application/json' -u user:password http://localhost/test/

Но, когда я пытаюсь сделать то же самое с powershell webRequest, я получаю 403 (разрешение запрещено).Этот скрипт работает нормально, когда я отключаю проверку подлинности в коде REST.

Каков наилучший способ в PowerShell передавать учетные данные по запросу POST, аналогичные curl, или что я могу сделать, чтобы исправить следующий скрипт.* Был бы очень признателен за некоторые рекомендации по этому вопросу.Спасибо.

Вот мой сценарий PowerShell:

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

Ответы [ 4 ]

18 голосов
/ 20 января 2012

Ваш код выглядит хорошо, я бы попытался добавить заголовок HTTP_AUTHORIZATION для $ webrequest, например:

$webRequest.Headers.Add("AUTHORIZATION", "Basic YTph");

Где YTph будет строка с кодировкой base64 для имени пользователя: пароль.

17 голосов
/ 02 мая 2014

Я знаю, что это старый поток, но для тех, кто может наткнуться на это, метод invoke-restmetho является гораздо лучшим и более простым средством для выполнения вызовов 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.

4 голосов
/ 19 января 2012

Свойство Credentials, похоже, используется для аутентификации Windows.Попробуйте использовать эту функцию: Принудительная базовая аутентификация в WebRequest Я бы посоветовал вам в любом случае использовать какой-нибудь веб-отладчик, например Fiddler, чтобы увидеть разницу между запросом curl и вашим запросом

0 голосов
/ 07 июля 2016

Это код, который я использую для загрузки страниц из 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...