2012-01-19 18 views
20

tengo authentatication básica trabajar con la API REST utilizando rizo:PowerShell HTTP Post REST API de autenticación básica

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

Pero, cuando trato de hacer lo mismo con WebRequest PowerShell, me sale 403 (permiso denegado). Esta secuencia de comandos funciona bien cuando deshabilito la comprobación de autenticación en el código REST.

¿Cuál es la mejor manera en powershell para pasar credenciales en la solicitud POST similar a curl o qué puedo hacer para corregir la siguiente secuencia de comandos.

Realmente agradecería alguna orientación sobre esto. Gracias.

Aquí está mi script de 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 

Respuesta

17

Su código se ve bien, me gustaría probar la adición de cabecera HTTP_AUTHORIZATION por $ webrequest como este:

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

Donde YTph sería la cadena base64encoded para nombre de usuario: contraseña.

+0

Gracias! Esto lo hizo por mí. –

+0

Puede usar http://www.base64encode.org/ para obtener una cadena UTF-8 Base64. – SeriousM

4

Credenciales propiedad parece ser utilizado para la autenticación de Windows. Trate de usar esta función: Forcing Basic Authentication in WebRequest Te aconsejaría, en cualquier caso utilizar alguna de depuración Web, como Fiddler para ver la diferencia entre la solicitud de rizo y su solicitud

16

Sé que este es un hilo viejo, pero para aquellos que puedan toparse con esto el método invoke-rest es un vehículo mucho mejor y más simple para hacer llamadas API con PowerShell.

Construir una lista de parámetros como una tabla hash:

$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 

su tabla hash parámetro puede variar ligeramente.

En realidad no he conseguido esto para trabajar con Trello, pero tengo con GitHub, Serena Business Manager y Jira.

+0

Una nota para todos: 'Invoke-RestMethod' funciona bien para la mayoría de las llamadas remotas de api de JIRA. Sin embargo, he encontrado que 'Invoke-WebRequest' es necesario para actualizar los problemas 'fix-version y affect-version (' fixVersions', y 'versions', probados extensamente). Si obtienes tiempos de espera, considera cambiar por lo menos estos dos. Es un problema en nuestra JIRA de servidor privado, pero no en mi instancia personal de JIRA en la nube. – bunkerdive

0

Este es el código que uso para descargar páginas de Confluence como archivos 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 

La IU de host solicitada se puede utilizar para solicitar al usuario que ingrese su información de inicio de sesión.

Descomentar una variable para mostrar a la salida del sistema el contenido de la forma, la página recuperada, etc para depurar fallos $ r $ $ formulario contenido

Cuestiones relacionadas