0

我在 Powershell 中运行以下命令。我收到一个错误返回“给定的客户端凭据无效”。我正在尝试执行使用 API 的第一步,生成访问令牌。我已经确认我有一个有效的 client_id 和 client_secret。

这在 Postman 中工作,但我没有看到我在 Powershell 中有什么问题。帮助!

$URLTokenV2="https://accounts.adp.com/auth/oauth/v2/token?grant_type=client_credentials"
$Json= @{
    client_id='xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx'
    client_secret='xxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxxxxx'
}
$Json=$Json | ConvertTo-Json
$Cert = Get-ChildItem -Path "Cert:\LocalMachine\My" | Where-Object {$_.Subject -like "CN=CertCN*"}
$Response=Invoke-RestMethod -Uri $URLTokenV2 -Method Post -Body $Json -Certificate $Cert -ContentType 'application/x-www-form-urlencoded'

我对 Invoke-RestMethod 和 Invoke-WebRequest 进行了同样的尝试。我对两者都得到相同的结果,即客户端凭据无效。

回应表示赞赏。提前致谢。

4

2 回答 2

0

根据 Mathias 的评论,我现在有以下工作

$URLTokenV2="https://accounts.adp.com/auth/oauth/v2/token?"
$Json= @{
     client_id='xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx'
     client_secret='xxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxxxxx'
     grant_type='client_credentials'
}
$Response=Invoke-RestMethod -Uri $URLTokenV2 -Method Post -Body $Json -Certificate $Cert -ContentType 'application/x-www-form-urlencoded'

我曾尝试将“grant_type='client_credentials'”作为 Json 数组的一部分,但这次我尝试它时不小心留下了“?” 在网址中。我还必须删除转换为 JSON 的行。之后它起作用了。

于 2021-06-11T20:57:39.423 回答
0

来自ADP 的公开文档

通常,您的消费者应用程序应使用 HTTP 基本身份验证方案(或其他指定方案)在 HTTP 授权标头中传递 client_id 和 client_secret 参数。根据 IETF RFC 2617 的要求,client_id 和 client_secret 必须由单个冒号 (":") 字符分隔并在 base64 编码字符串中进行编码。

您的消费者应用程序必须:

  • 使用注册期间提供的 X.509 证书发送请求。
  • 按照 HTTP 标头 Content-Type: application/x-www-form-urlencoded 指定的 UTF-8 字符编码,以 URL 编码格式传递所有参数。实际请求可能类似于以下示例:
 POST /auth/oauth/v2/token HTTP/1.1
 Host: accounts.adp.com
 Authorization: Basic QURQVGFibGV0OnRoZXRhYmxldHBhc3N3b3Jk
 Content-Type: application/x-www-form-urlencoded
 grant_type=client_credentials

所以你需要做这样的事情:

$URLTokenV2 = 'https://accounts.adp.com/auth/oauth/v2/token'

# Prepare Basic Authentication header payload (the base64 part)
$AuthorizationValue = [Convert]::ToBase64String(
  [System.Text.Encoding]::UTF8.GetBytes('xxxxxxxxx-client-id-xxxxxxxxx:xxxxxx-client-secret-xxxxxxxxxxxx')
)

$Cert = Get-ChildItem -Path "Cert:\LocalMachine\My" | Where-Object {$_.Subject -like "CN=CertCN*"}

# Prepare request body - no need to explicitly convert to JSON 
$Body = @{
  grant_type = 'client_credentials'
}

# Pass the `Authorization` header value with the payload we calculate from the id + secret
$Response = Invoke-RestMethod -Uri $URLTokenV2 -Method Post -Header @{ Authorization = "Basic ${AuthorizationValue}" } -Body $Body -Certificate $Cert -ContentType 'application/x-www-form-urlencoded'
于 2021-06-11T20:47:22.897 回答