【问题标题】:Google OAuth2 returns "unsupported_grant_type" via cURL (PHP)Google OAuth2 通过 cURL (PHP) 返回“unsupported_grant_type”
【发布时间】:2017-04-14 09:26:57
【问题描述】:

我想获取有关 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”发送请求,所以我得到了正确的结果。

请告诉我,我哪里错了?

【问题讨论】:

    标签: php curl google-api


    【解决方案1】:

    尝试以这种方式进行:

    $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,
    

    【讨论】:

    • 感谢您的回答!我试过你的方法,我得到了同样的错误......但是!当我尝试不同的“redirect_uri”时,我解决了我的麻烦。而且我不明白,为什么我不能在参数中使用每个 URI?它们都添加到我的 Google App 列表中,但 6 URI 中只有一个(不是第一个!)有效!我在设置我的 Google 应用时错过了什么?
    • 我找到了解决方案。顺便说一句,需要将“redirect_uri”设置为与获取“代码”的第一个请求中设置的 URL 相同。就这样。 P.S.:也许我错过了文档中的这个注释...... :(
    【解决方案2】:

    我在 c# 中执行此操作,并认为我的问题可能与此有关。指定 redirect_url 或任何其他字符串时,请确保转义 URI,否则会弄乱发布请求。这是因为请求是使用 application/x-www-form-urlencoded 类型发送的。

    【讨论】:

      【解决方案3】:

      我收到了同样的错误信息。经过一番研究,我知道我正在使用 access_type = 'offline' 创建代码,这是一个问题。

      所以我从我的请求中删除了这个参数,并在不使用 access_type = 'offline' 的情况下生成了新代码。

      问题解决了。

      如果您有任何问题,请尝试或告诉我。

      【讨论】:

      • 如果这样会很奇怪,但仍然不是根本原因,如果我们真的想要离线 access_type 并且仍然希望它工作怎么办?
      【解决方案4】:

      确保您的授权码没有过期。因为那是我做错了,我得到了同样的错误响应。我实际上是通过发送旧的授权代码来测试我的代码。一旦我将我的代码绑定到实际的 oauth 工作流程,它就起作用了!

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2017-08-29
          • 2012-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-04
          • 2014-03-27
          相关资源
          最近更新 更多