我想获取有关Google帐户的数据。我使用下一个代码:
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://www.googleapis.com/oauth2/v4/token',
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Cache-Control: no-cache',
'Content-Type: application/x-www-form-urlencoded',
],
CURLOPT_POSTFIELDS => [
'code' => $code,
'client_id' => '{MY_CLIENT_ID}',
'client_secret' => '{MY_CLIENT_SECRET}',
'redirect_uri' => '{SOME_URL}'
'grant_type' => 'authorization_code',
]
));
$result = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
结果我得到下一个错误:
{
"error": "unsupported_grant_type",
"error_description": "Invalid grant_type: "
}
我使用了以下说明:
https://developers.google.com/identity/protocols/OpenIDConnect
变量$code
和其他数据有效!因为我尝试通过" PostMan"发送请求。在那里我得到了正确的结果。
请告诉我,我有错误?
答案 0 :(得分:0)
尝试以这种方式做到这一点:
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://www.googleapis.com/oauth2/v4/token',
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_POSTFIELDS => http_build_query([
'code' => $code,
'client_id' => '{MY_CLIENT_ID}',
'client_secret' => '{MY_CLIENT_SECRET}',
'redirect_uri' => '{SOME_URL}'
'grant_type' => 'authorization_code',
]),
));
顺便说一句,您可以使用
调试curl请求CURLOPT_VERBOSE => true,
答案 1 :(得分:0)
我在c#中这样做,并认为我的问题可能是相关的。在指定redirect_url或任何其他字符串时,请确保转义URI,否则会弄乱帖子请求。这是因为请求是使用application / x-www-form-urlencoded类型发送的。
答案 2 :(得分:0)
我收到了相同的错误消息。经过研究,我知道我正在使用 access_type ='offline'创建代码,这是一个问题。
因此,我从请求中删除了此参数,并生成了新代码,而没有使用 access_type ='offline'。
问题解决了。
如果您有任何问题,请尝试或让我知道。
答案 3 :(得分:0)
确保您的授权码尚未过期。因为那是我做错的事情,所以我得到了相同的错误响应。我实际上是通过发送旧的授权代码来测试代码的。一旦我将代码绑定到实际的oauth工作流程,它就起作用了!
答案 4 :(得分:0)
上面的代码在此行末尾缺少逗号:
'redirect_uri' => '{SOME_URL}'
完整代码应为:
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://www.googleapis.com/oauth2/v4/token',
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Cache-Control: no-cache',
'Content-Type: application/x-www-form-urlencoded',
],
CURLOPT_POSTFIELDS => [
'code' => $code,
'client_id' => '{MY_CLIENT_ID}',
'client_secret' => '{MY_CLIENT_SECRET}',
'redirect_uri' => '{SOME_URL}',
'grant_type' => 'authorization_code',
],
));
$result = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);