Google云端硬盘访问令牌问题详情

时间:2016-01-19 08:44:05

标签: google-drive-api access-token

我必须直接在drupal上的google驱动器上传文件。我已经为此创建了一个自定义模块。

$client = new Google_Client();
$client->setAccessType('online');
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setRedirectUri($redirect_uri);
$client->addScope("https://www.googleapis.com/auth/drive");
$service = new Google_Service_Drive($client);
//parameter got from code

if (isset($_REQUEST['logout'])) {
    unset($_SESSION['upload_token']);
}

if (isset($params['code'])) {
    try{
        $client->authenticate($params['code']);       //client Authenticate with OAuth2 code
    } catch (Exception $e) {
        echo 'Caught exception: ',  $e->getMessage(), "\n";      //Exception Caught
    }
    $_SESSION['upload_token'] = $client->getAccessToken();
    $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
    header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
}

//access token value saved in session
//print_r($_SESSION['upload_token']); "<br>";
if (isset($_SESSION['upload_token']) && $_SESSION['upload_token']) {
    //$about = $service->about->get();
    //echo '<pre>12';print_r($about);
    $client->setAccessToken($_SESSION['upload_token']);
    if ($client->isAccessTokenExpired()) {
        unset($_SESSION['upload_token']);
        //drupal_goto('http://localhost/drupal/drivefile/form');
        //drupal_set_message(t('Access Token expired.'), 'error');
    }
} 
else {
    $auth_url = $client->createAuthUrl();
}

/************************************************
If we're signed in then lets try to upload our
file.
************************************************/
if ($client->getAccessToken()) {
    // Now lets try and send the metadata as well using multipart!
    $file = new Google_Service_Drive_DriveFile();
    $file->setTitle($_SESSION['filename']);
    try{
        $fileupload = "public://" . $_SESSION['filename'];
        $data = file_get_contents($fileupload);
        $result2 = $service->files->insert(
            $file, array(
                'data' => $data,
                'mimeType' => $_SESSION['mimetype'],
                'uploadType' => 'multipart'
            )
        );
    } catch (Exception $e) {
        echo 'Caught exception: ', $e->getMessage(), "\n";      //Exception Caught
    }
}

问题是假设我从邮件ID中获取了访问令牌,并且该文件已上传到该ID,之后我没有从我的网站注销。我已经从gmail id登出但是我的网站上的访问令牌存在于我的网站中,我再次上传文件而不是我之前的mailid上的代码上传文件而不是第二个id,因为我网站上的访问令牌存在并且与第一个相关联邮件ID,所以它上传第一个id。请给我一个解决这个问题的方法。谢谢提前

1 个答案:

答案 0 :(得分:0)

访问GMail并通过访问令牌访问Drive是不同的。将GMail视为您无法控制的另一个应用程序。它具有来自您的应用程序的不同访问令牌。有了这个,如果您退出GMail并且您的webapp的凭据没有 - 它仍将执行您的webapp所做的预期功能(即将文件上传到云端硬盘)。

您可以做的是在您的webapp上注销用户,以便撤销访问令牌。另一个用户可以登录,将向他/她提供新的访问令牌。