Google OAuth2返回" unsupported_grant_type"通过cURL(PHP)

时间:2017-04-14 09:26:57

标签: php curl google-api

我想获取有关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"发送请求。在那里我得到了正确的结果。

请告诉我,我有错误?

5 个答案:

答案 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);