Google OAuth2通过cURL返回“不支持的授权类型”(PHP)

ny6fqffe  于 2022-11-13  发布在  Go
关注(0)|答案(5)|浏览(174)

我想获得有关谷歌帐户的数据.我使用下一个代码:

$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 ”发送请求,我得到了正确的结果。
请告诉我,我哪里错了?

vbopmzt1

vbopmzt11#

试着这样做:

$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',
    ]),
));

顺便说一句,您可以使用

CURLOPT_VERBOSE => true,
abithluo

abithluo2#

我在C#中做了这个,我想我的问题可能是相关的。当指定redirect_url或任何其他字符串时,确保你转义了URI,否则它会弄乱post请求。这是因为请求是使用application/x-www-form-urlencoded类型发送的。

tez616oj

tez616oj3#

我收到了同样的错误信息。经过一些研究,我知道我正在使用**access_type = 'offline'创建代码,这是一个问题。
因此,我从请求中删除了此参数,并在不使用
access_type = 'offline'**的情况下生成了新代码。
问题就解决了。
请尝试或让我知道,如果你有任何问题。

np8igboo

np8igboo4#

确保你的授权码没有过期。因为这是我做错的,我得到了同样的错误响应。我实际上是通过发送一个旧的授权码来测试我的代码。当我把我的代码绑定到实际的oauth工作流时,它就工作了!

5sxhfpxr

5sxhfpxr5#

上面的代码在这一行的末尾缺少一个逗号:

'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);

相关问题