Google Drive PHP API: удаление показывает недостаточное разрешение

Я работал над удалением файла на моем 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 Explorer, и он работал без проблем.

Диск Google, над которым я работаю, принадлежит мне, и я могу удалить файл напрямую без каких-либо проблем. Чего может не хватать в моем коде?

Вы успешно сохранили токен в token.json?

Rinsad Ahmed 20.08.2018 12:59

@RinsadAhmed Я так думаю. Потому что я смог получить список своих файлов. Просто удалить не получается.

elimariaaa 20.08.2018 13:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
760
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

"Insufficient Permission"

Просто означает, что пользователь, который в настоящее время аутентифицирован, не имеет разрешения делать то, что вы пытаетесь сделать.

Вы сказали, что изменили прицелы. Но вы перепроверили приложение? Приложение появится и запросит разрешение для учетной записи диска. Если вы все еще работаете со старым токеном доступа или обновленным токеном, у которого все еще есть доступ только для чтения, вы не сможете удалить файл.

по-прежнему использование устаревшего токена кажется разумным, в то время как в документации даже не указано, что 403: developers.google.com/drive/api/v3/handle-errors

Martin Zeitler 20.08.2018 15:20

«Недостаточное разрешение» - это сообщение об ошибке по умолчанию для всех API Google. Он не будет отображаться на странице сообщений об ошибках для конкретного Диска.

DaImTo 20.08.2018 15:22

Да! Работайте у меня только на то, чтобы:

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

И вам нужно перезапустить сеанс. Ищите файл:

token.json

в своем каталоге удалите этот файл token.json и снова попробуйте quickstart.php. Вы запрашиваете новые учетные данные, и теперь ваш доступ для загрузки файлов завершен.

Другие вопросы по теме