Google Drive PHP API:删除显示权限不足

时间:2018-08-20 10:54:25

标签: php google-api google-drive-api google-api-php-client

我一直在删除Google云端硬盘中的文件,但无法正常运行。我已将范围从$client->setScopes(Google_Service_Drive::DRIVE_METADATA_READONLY);更改为$client->setScopes(Google_Service_Drive::DRIVE);

这是我的完整代码:

<?php
require __DIR__ . '/vendor/autoload.php';

if (php_sapi_name() != 'cli') {
 throw new Exception('This application must be run on the command line.');
}

/**
* Returns an authorized API client.
* @return Google_Client the authorized client object
*/
function getClient()
{
  $client = new Google_Client();
  $client->setApplicationName('Google Drive API PHP Quickstart');
  //$client->setScopes(Google_Service_Drive::DRIVE_METADATA_READONLY);
  $client->setScopes(Google_Service_Drive::DRIVE);
  //$client->setScopes(Google_Service_Drive::DRIVE_APPDATA);
  //$client->setScopes(Google_Service_Drive::DRIVE_FILE);
  //$client->setAuthConfig('credentials.json');
  $client->setAccessType('offline');

  // Load previously authorized credentials from a file.
  $credentialsPath = 'token.json';
  if (file_exists($credentialsPath)) {
    $accessToken = json_decode(file_get_contents($credentialsPath), true);
  } else {
    // Request authorization from the user.
    $authUrl = $client->createAuthUrl();
    printf("Open the following link in your browser:\n%s\n", $authUrl);
    print 'Enter verification code: ';
    $authCode = trim(fgets(STDIN));

    // Exchange authorization code for an access token.
    $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);

    // Check to see if there was an error.
    if (array_key_exists('error', $accessToken)) {
        throw new Exception(join(', ', $accessToken));
    }

    // Store the credentials to disk.
    if (!file_exists(dirname($credentialsPath))) {
        mkdir(dirname($credentialsPath), 0700, true);
    }
    file_put_contents($credentialsPath, json_encode($accessToken));
    printf("Credentials saved to %s\n", $credentialsPath);
}
$client->setAccessToken($accessToken);

// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) {
    $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
    file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
}
    return $client;
}


// Get the API client and construct the service object.
$client = getClient();
$service = new Google_Service_Drive($client);

/*Get Files under hourly_backup*/
$hourly_backup_id = '1Y3cGEwXy9gLcw9WO0isqwtwtysU0g_bK';

$optParams = array(
  //'pageSize' => 20,
  'fields' => 'nextPageToken, files(id,name,size,parents,createdTime)',
  'q' => "'".$hourly_backup_id."' in parents"
);
$results = $service->files->listFiles($optParams);

if (count($results->getFiles()) == 0) {
    print "No files found.\n";
} else {
    foreach ($results->getFiles() as $file) {
        if(strtotime(date('Y-m-d H:i:s', strtotime($file->getcreatedTime()))) <= strtotime('-48 hours')){
            try {
                return $service->files->delete($file->getId());
            } catch (Exception $e) {
                print "An error occurred: " . $e->getMessage();
            }
            return NULL;
        } else {
           print "weh \n";
        }
    }
}

如果满足条件并且运行了删除代码,这就是我得到的:

An error occurred: {
 "error": {
   "errors": [
   {
    "domain": "global",
    "reason": "insufficientPermissions",
    "message": "Insufficient Permission"
   }
  ],
  "code": 403,
  "message": "Insufficient Permission"
 }
}

更新:

我也在API资源管理器中进行了尝试,并且没有任何问题。

我正在使用的google驱动器是我的,我可以直接删除文件而没有任何问题。我的代码中可能缺少什么?

2 个答案:

答案 0 :(得分:1)

  

“权限不足”

仅表示当前已通过身份验证的用户无权执行您尝试执行的操作。

您说您更改了范围。但是您是否重新授权了该应用程序?该应用程序将弹出并请求对驱动器帐户的许可。如果您仍使用旧的访问令牌或仍具有只读访问权限的刷新令牌运行,则将无法删除该文件。

答案 1 :(得分:0)

是的! 为我而努力只希望:

$client->setScopes(Google_Service_Drive::DRIVE);

您需要重新命名会话。 查找文件:

token.json

在您的目录中,删除此token.json文件,然后再次尝试quickstart.php。 您需要新的信用凭证,现在可以上传文件了。