2012-01-19 13 views
20

나는 REST API를 사용하여 컬 작업의 기본 authentatication 있습니다. REST 코드에서 인증 확인을 사용하지 않으면이 스크립트가 제대로 작동합니다.PowerShell을 HTTP POST를 REST API 기본 인증

curl과 비슷한 POST 요청시 자격 증명을 전달하는 가장 좋은 방법은 무엇입니까? 아니면 다음 스크립트를 수정하기 위해 할 수있는 방법은 무엇입니까?

정말 이에 대한 약간의 안내를 부탁드립니다. 감사.

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 

답변

17

, 나는 $에 대한 HTTP_AUTHORIZATION 헤더를 추가하려고 할 것 웹 요청은 다음과 같습니다 :

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

여기서 YTph는 username : password의 base64 인코딩 문자열입니다.

+0

감사합니다 $ R $ 폼 $ 내용을 문제 해결 방법을 시스템 출력에 표시! 이것은 나를 위해 그것을했다. –

+0

http://www.base64encode.org/에서 UTF-8 Base64 문자열을 얻을 수 있습니다. – SeriousM

4

자격 증명 속성은 Windows 인증에 사용되는 것 같다

여기 내 파워 쉘 스크립트입니다. 이 기능을 사용해보십시오 : 피들러는 컬 요청하고 요청 사이의 차이를 볼 수와 같은 일부 웹 디버거를 사용하는 가 Forcing Basic Authentication in WebRequest 난 어떤 경우에 당신을 권합니다하면 코드가 잘 보이는

16

이 API는 오래된 스레드이지만 invoke-restmethod를 우연히 발견 할 수있는 사용자는 PowerShell을 사용하여 API 호출을 수행하는 데있어 훨씬 쉽고 간편합니다.

빌드 해시 테이블과 같은 매개 변수 목록 :

$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와 함께했습니다.

+0

전체 메모 :'Invoke-RestMethod'는 대부분의 JIRA 나머지 API 원격 호출에서 잘 작동합니다. 그러나, 나는'Invoke-WebRequest'가 문제 수정 버전과 영향 버전 ('fixVersions' 및'versions', 광범위하게 테스트 됨)을 업데이트하는 데 필요하다는 것을 발견했습니다. 시간 초과가 발생하면 최소한이 두 가지를 전환하는 것을 고려하십시오. 개인 서버 JIRA의 문제이지만 개인 클라우드 JIRA 인스턴스의 문제는 아닙니다. – bunkerdive

0

이것은 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 

호스트 UI 프롬프트는 사용자에게 로그온 정보를 입력하도록 요청하는 데 사용할 수 있습니다.

의 주석 변수의 형식은, 검색된 페이지 등의 내용이