1

I'm trying to translate these two (working) curl commands, into powershell. How do you save a cookie with Invoke-WebRequest?

Get Session 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

Get 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)"

Get version bash

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

Get version 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

The second command is not passing in the cookie properly and returns error 'Decoding failed'

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

Why does curl successfully authenticate with a cookie, but powershell errors?

Looking at the variable $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
spuder
  • 17,437
  • 19
  • 87
  • 153

1 Answers1

2

Found the solution here

The $data variable is an Object, whereas the api expects json

 $data.gettype()

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

The solution is to convert $data to json (ConvertTo-Json $data)

Invoke-WebRequest -Method POST `
-ContentType 'application/json' `
-Body (ConvertTo-Json $data) `
-Uri $url `
-WebSession $websession `
-UseBasicParsing
spuder
  • 17,437
  • 19
  • 87
  • 153