为什么我从授权代码调用访问令牌交换失败?

Why my call for access token exchange from authorization code failed?

我正在使用 Huawei account kit 的验证码模式让用户登录我的应用程序。为了检查应用服务器对帐户服务器的行为,我使用如下所示的 cURL 命令从授权代码中获取访问令牌。但是下面的命令会 return 一个错误。

curl -v -H "Content-Type:application/x-www-form-urlencoded" -d @body.txt -X POST https://oauth-login.cloud.huawei.com/oauth2/v3/token

“body.txt”文件包含请求所需的信息:

grant_type=authorization_code&
code=DQB6e3x9zFqHIfkHR2ctp7htDs5tG5p6jXTkTCeoAAULtuS69PntuuD9pwqHrdXyvrlezuRc/aq+zuDU7OnQdRpImnvZcEX+RIOijYMXYu1j+zxpQ+W/J50Z7pY1qhyxZtavqkELY+6o2jSifaiIxC/MJc7KgqKV3jGn9kUIEZovSnM&
client_id=my_id&
client_secret=my_secrete&
redirect_uri=hms://redirect_uri

命令returns:

> POST /oauth2/v3/token HTTP/1.1
> Host: oauth-login.cloud.huawei.com
> User-Agent: curl/7.64.0
> Accept: */*
> Content-Type:application/x-www-form-urlencoded
> Content-Length: 430
>
* upload completely sent off: 430 out of 430 bytes
< HTTP/1.1 400 Bad Request
< Date: Mon, 23 Nov 2020 03:38:21 GMT
< Content-Type: application/json
< Content-Length: 67
< Connection: keep-alive
< Cache-Control: no-store
< Pragma: no-cache
< Server: elb
<
* Connection #0 to host oauth-login.cloud.huawei.com left intact
{"sub_error":20152,"error_description":"invalid code","error":1101}

我应该怎么做才能让这个 API 调用按预期使用 cURL 工作?

验证码必须在发送前进行urlencode。问题中的命令使用了没有对非字母字符进行 urlencoding 的代码。请使用带有编码授权代码的相同命令作为“代码”的参数来执行获取访问令牌的请求

如果需要,可以内联编码 curl --data-urlencode "para1=value1"

请参考:Link or using online tool such as : Link

只要参数以 %2x 格式正确编码,就可以使用其他工具获取访问令牌。

根据错误信息{"sub_error":20152,"error_description":"invalid code","error":1101},问题是代码参数不正确造成的

建议检查请求中code的值是否与手机端获取的Authorization Code相同

详情见docs