Google云端硬盘OAuth => response =暂时移动

时间:2014-09-04 10:04:44

标签: php oauth google-drive-api

我正在尝试编写一个小型PHP代码,该代码应该能够对Google帐户进行身份验证,然后将文件上传到其Google云端硬盘。

此过程应分两步完成:

  1. 发送身份验证请求并获取授权代码
  2. 发布授权码并获取用于将其他请求(例如:文件上传)发送到Google云端硬盘的访问令牌。
  3.   

    请注意,使用Google Client Library一切顺利。

    我想要达到的目的是不使用Google客户端库,而是使用here所述的简单身份验证步骤。

    通过使用前面提到的这些身份验证步骤,我发送了一个请求:

      

    https://accounts.google.com/o/oauth2/auth?scope=email%20profile&redirect_uri=http://example.com&response_type=code&client_id=[my-client-id]

    作为交换,重定向页面应包含“code = xxxx”参数,如:

      

    http://example.com?code=xxx

    其中xxx是Google前面提到的上述 redirect_uri 的授权码。

    问题是,Google会返回错误消息,例如暂时移动,并提供“文档已移动here。”的链接。如果我点击该链接,那么一切正常。

    但我不希望用户干预,因为此代码在服务器级别而不是在客户端级别工作。

    如何解决此问题?请不要回答“使用Google客户端库”!因为我已经说过这样做会有效,但我不想要谷歌客户端库依赖!

    我的PHP代码是:

        

    $CLIENT_ID = '[the client ID from Google Developer Console]';
    $CLIENT_SECRET = '[the client secret from Google Developer Console]';
    $REDIRECT_URI = 'http' . ($_SERVER['SERVER_PORT'] == 80 ? '' : 's') . '://' . $_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_NAME'];
    
    $ch = curl_init();
    
    if (isset($_GET['code']))
    {
        $url = 'https://accounts.google.com/o/oauth2/token';
    
        $post_fields = 'code=' . $_GET['code'] . '&client_id=' . $CLIENT_ID . '&client_secret=' . $CLIENT_SECRET . '&redirect_uri='
                . $REDIRECT_URI . '&grant_type=authorization_code';
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER,
                array('Host:accounts.google.com', 'Content-Type:application/x-www-form-urlencoded', 'Content-Length:' . strlen($post_fields))
        );
    
    }
    else
    {
        $url = sprintf('https://accounts.google.com/o/oauth2/auth?scope=email%%20profile&redirect_uri=%s&response_type=code&client_id=%s',
                $REDIRECT_URI, $CLIENT_ID
        );
    
    }
    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    
    $result = curl_exec($ch);
    
    $error_no = curl_errno($ch);
    curl_close($ch);
    
    echo $result;
    ?>
    

1 个答案:

答案 0 :(得分:0)

此类问题的解决方案是

  • 不要通过CURL调用第一个请求,而是通过更改文档位置

同时更改此块:

...
else
{
    $url = sprintf('https://accounts.google.com/o/oauth2/auth?scope=email%%20profile&redirect_uri=%s&response_type=code&client_id=%s',$REDIRECT_URI, $CLIENT_ID);
}

这一个:

...
else
{
    $url = sprintf('https://accounts.google.com/o/oauth2/auth?scope=email%%20profile&redirect_uri=%s&response_type=code&client_id=%s',$REDIRECT_URI, $CLIENT_ID);
    header('Location:'.$url);
}