当 cmd 中的 cURL 工作正常时,Invoke-RestMethod 返回 "invalid user"

Invoke-RestMethod returning "invalid user" when cURL in cmd works fine

我正在尝试使用 Invoke-RestMethod cmdlet 运行 PowerShell 中的 cURL 命令,但它无法正常工作。

它连接到服务器并且API 密钥被接受。但是,凭证没有正确传递,我收到了

的回复
{"error":"Invalid user . Can't find credentials."}

当我在cmd中运行以下cURL命令时:

curl -X POST "https://valid_URI" -H "Content-Type: application/json" -H "x-api-key:KEY" -d "{"client_id":"VALID_ID","client_secret":"SECRET"}"

我得到了预期的响应:

{"auth_token": "TOKEN"}

太棒了,很管用!

从这里我想自动响应,因为令牌只能在 24 小时内使用,所以我认为 PowerShell 是使用 Invoke-RestMethod cmdlet 的好方法。

所以我尝试 运行:

$Headers = @{
'x-api-key' = 'KEY'
'client_id' = 'VALID_ID'
'client_secret' = 'SECRET'
}
$Parameters = @{
Uri = 'VALID_URI'
Method = 'Post'
Headers = $Headers
ContentType = 'application/json'
}
Invoke-RestMethod @Parameters

这给出了以下输出:

Invoke-RestMethod : {"error":"Invalid user . Can't find credentials."}
At line:13 char:1
+ Invoke-RestMethod @Parameters
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

我尝试了几种不同的变体,并更改了引号,但均无济于事。 我怀疑包含“==”的秘密由于某种原因被切碎了,但是使用单引号应该否定了这一点,因为 PowerShell 应该将单引号中的任何内容解释为字面意义吗?

模仿列出的 curl 命令:

curl -X POST "https://valid_URI" -H "Content-Type: application/json" -H "x-api-key:KEY" -d "{"client_id":"VALID_ID","client_secret":"SECRET"}"

您需要在正文而不是页眉中包含 client_id 和 client_secret。

$Headers = @{
'x-api-key' = 'KEY'
}
$Body = @{
'client_id' = 'VALID_ID'
'client_secret' = 'SECRET'
} | ConvertTo-Json
$Parameters = @{
Uri = 'VALID_URI'
Method = 'Post'
Headers = $Headers
Body = $Body
ContentType = 'application/json'
}
Invoke-RestMethod @Parameters
Invoke-RestMethod -Method Post -Uri "VALID_URI" -Headers @{"Content-Type" = "application/json"; "x-api-key" = $API_KEY} -Body (ConvertTo-Json @{"client_id" = "VALID_ID"; "client_secret" = "SECRET"}) 

这就是最终的效果。我离得不远,谢谢大家的帮助!