我在Salesforce中使用Google OAuth时收到400错误请求。以下错误与grant_type无效有关,但如果您查看'使用刷新令牌'你会发现它是正确的。
错误:
{
"error": "unsupported_grant_type",
"error_description": "Invalid grant_type: "
}
我正在尝试为访问令牌交换refresh_token,并且可以使用CURL使用以下代码成功执行此操作。
curl \
-d refresh_token=REFRESH_TOKEN \
-d client_id=CLIENT_ID \
-d client_secret=CLIENT_SECRET \
-d grant_type=refresh_token https://www.googleapis.com/oauth2/v4/token
我在Salesforce中使用的代码:
Http http = new Http();
HttpRequest req = new HttpRequest();
req.setHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
req.setHeader('Content-Length', '0');
req.setHeader('client_id', 'CLIENT_ID');
req.setHeader('client_secret', 'CLIENT_SECRET');
req.setHeader('refresh_token', 'REFRESH_TOKEN');
req.setHeader('grant_type', 'refresh_token');
req.setEndpoint('https://www.googleapis.com/oauth2/v4/token');
req.setMethod('POST');
return http.send(req);
答案 0 :(得分:6)
-d
curl选项使用application/x-www-form-urlencoded
内容类型在请求正文中发送数据,这是在OAuth2中发送这些参数的受支持方式之一。
-d
将POST请求中的指定数据发送到HTTP服务器,就像用户填写HTML表单并按下提交按钮时的浏览器一样。这将导致curl使用content-type application / x-www-form-urlencoded将数据传递到服务器。
在Salesforce代码中,您设置了正确的内容类型,但随后将OAuth2相关参数作为附加标头发送,而不是在请求正文中发送。
您需要更新代码,以使用application/x-www-form-urlencoded
编码在请求正文中发送参数。
答案 1 :(得分:0)
我在提琴手中遇到了同样的问题。我添加了此评论,因为它可能对某人有所帮助。
https://oauth2.googleapis.com/token
Content-Type: application/x-www-form-urlencoded
Request Body:
code=<some code here>&
client_id=your_client_id&
client_secret=your_client_secret&
redirect_uri=https%3A//oauth2.example.com/code&
grant_type=authorization_code
Goole api响应:
{"error": "unsupported_grant_type", "error_description": "Invalid grant_type: "}
发生此问题是因为请求正文在每个参数之间都有换行符。如果您删除所有换行符,则将所有值保留在单个行请求中就可以了。例如请求正文:
code=<some code here>&client_id=your_client_id&client_secret=your_client_secret&redirect_uri=https%3A//oauth2.example.com/code&grant_type=authorization_code