2017-02-23 330 views
1

我正試圖將這兩個(工作)捲曲命令轉換爲PowerShell。 如何使用Invoke-WebRequest保存cookie?PowerShell使用Cookie進行身份驗證

獲取會話Cookie的bash

curl -k \ 
--cookie-jar cookie \ 
-H 'Content-Type: application/json' \ 
-d '{"jsonrpc": "2.0", "id": 1, "method": "login", "params": {"username": "bob", "password": "correct-horse-battery-staple"}}' \ 
https://foo.example.com/api/session 

獲取會話Cookie的PowerShell

$data = @{} 
$data.jsonrpc = '2.0' 
$data.id = '1' 
$data.method = 'login' 
$data.params = @{} 
$data.params.username = 'bob' 
$data.params.password = 'correct-horse-battery-staple' 
$url = "https://foo.example.com/api/session" 
$webrequest = Invoke-WebRequest -Method POST ` 
-ContentType 'application/json' ` 
-Body $data ` 
-Uri $url ` 
-SessionVariable websession ` 
-UseBasicParsing 
$cookies = $websession.Cookies.GetCookies($url) 
Write-Host "$($cookies[0].name) = $($cookies[0].value)" 

獲取版本的bash

curl -k \ 
--cookie cookie \ 
-H 'Content-Type: application/json' \ 
-d '{"jsonrpc": "2.0", "id": 2, "method": "version"}' \ 
https://foo.example.com/api/about 

獲取版本的PowerShell

$data = @{} 
$data.jsonrpc = '2.0' 
$data.id = '2' 
$data.method = 'version' 
$url = "https://foo.example.com/api/about" 
Invoke-WebRequest -Method POST ` 
-ContentType 'application/json' ` 
-Body $data ` 
-Uri $url ` 
-WebSession $websession ` 
-UseBasicParsing 

第二個命令不流通在cookie正確和返回錯誤的譯碼失敗「

StatusCode  : 200 
StatusDescription : OK 
Content   : {"error":{"code":-32000,"message":"Decoding failed: Syntax error","data":null},"id":null} 
RawContent  : HTTP/1.1 200 OK 
        Pragma: no-cache 
        Keep-Alive: timeout=5, max=100 
        Connection: Keep-Alive 
        Content-Length: 89 
        Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
        Content-Ty... 
Forms    : 
Headers   : {[Pragma, no-cache], [Keep-Alive, timeout=5, max=100], [Connection, Keep-Alive], [Content-Length, 89]...} 
Images   : {} 
InputFields  : {} 
Links    : {} 
ParsedHtml  : 
RawContentLength : 89 

爲什麼捲曲成功地與一個cookie進行身份驗證,但PowerShell的錯誤?

望着變量$ websession

$websession 

Headers    : {} 
Cookies    : System.Net.CookieContainer 
UseDefaultCredentials : False 
Credentials   : 
Certificates   : 
UserAgent    : Mozilla/5.0 (Windows NT; Windows NT 6.3; en-US) 
         WindowsPowerShell/5.0.10586.117 
Proxy     : 
MaximumRedirection : -1 

回答

1

Found the solution here

$ data變量是一個對象,而API預計JSON

$data.gettype() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  Hashtable        System.Object 

解決的辦法是$數據轉換爲json (ConvertTo-Json $data)

Invoke-WebRequest -Method POST ` 
-ContentType 'application/json' ` 
-Body (ConvertTo-Json $data) ` 
-Uri $url ` 
-WebSession $websession ` 
-UseBasicParsing 
相關問題