web-dev-qa-db-fra.com

powershell http post REST Authentification de base API

J'ai une authentification de base fonctionnant avec l'API REST à l'aide de curl:

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

Mais, lorsque j'essaie de faire la même chose avec powershell webRequest, je reçois 403 (autorisation refusée) . Ce script fonctionne correctement lorsque je désactive l'authentification dans le code REST.

Quelle est la meilleure manière dans powershell de transmettre des informations d’authentification sur une demande POST similaire à curl ou sur ce que je peux faire pour corriger le script suivant.

J'apprécierais vraiment des conseils à ce sujet. Merci.

Voici mon script 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
20
R D

Votre code a l'air bien, j'essayerais d'ajouter l'en-tête HTTP_AUTHORIZATION pour $ webrequest comme ceci:

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

Où YTph serait la chaîne codée en base64 pour le nom d'utilisateur: mot de passe.

18
Raj J

Je sais que c’est un vieux fil conducteur, mais pour ceux qui risquent de tomber sur cela, la méthode invoke-rest est un moyen bien meilleur et plus simple de passer des appels d’API avec PowerShell.

Construisez une liste de paramètres sous forme de table de hachage:

$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

Votre table de hachage de paramètre peut différer légèrement.

En fait, je n’ai pas réussi à faire fonctionner cela avec Trello, mais je l’ai avec GitHub, Serena Business Manager et Jira.

17
Brian Bagent

La propriété Credentials semble être utilisée pour l'authentification Windows. Essayez d’utiliser cette fonction: Forcer l’authentification de base dans WebRequest Dans tous les cas, je vous conseillerais d’utiliser un débogueur Web, comme Fiddler pour voir la différence entre une requête curl et votre requête.

4
Andrey Marchuk

C’est le code que j’utilise pour télécharger les pages de Confluence sous forme de fichiers 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

L'interface utilisateur hôte proposée peut être utilisée pour demander à l'utilisateur de saisir ses informations de connexion. 

Décommentez une variable pour afficher sur le système la sortie du contenu du formulaire, de la page extraite, etc., pour résoudre les problèmes - $ r $ form $ content 

0
Underverse