# #php #google-cloud-storage #batch-processing
Вопрос:
У меня возникли проблемы с аутентификацией пакетных операций Google Cloud с использованием библиотеки PHP. Я специально пытаюсь выполнить пакетное удаление объектов облачного хранилища. Я все устраиваю так:
use GoogleCloudStorageStorageClient;
$config = [
'projectId' => <MY Project ID>
'keyFile' => json_decode(file_get_contents( <my json key file> ), true)
];
$google_client = new Google_Client($config);
$google_client->setUseBatch(true);
$delete_batch_storage_client = new Google_Service_Storage($google_client);
$delete_batch = new Google_Http_Batch($google_client, false, NULL, "batch/storage");
$storage_client = new StorageClient($config);
$bucket = $storage_client->bucket(<my bucket name>);
$params = [
'prefix' => <my image path>,
'fields' => 'items/name, items/size, items/updated'
];
foreach ( $bucket->objects($params) as $object )
{
$delete_batch->add($delete_batch_storage_client->objects->delete($bucket->name(), $object->name()));
}
$result = $delete_batch->execute();
Результат выполнения пакета->выполнить() говорит:
"Anonymous caller does not have storage.objects.delete access to the Google Cloud Storage object."
Выгружая некоторую отладочную информацию в создаваемом пакете, я не вижу
заголовков аутентификации ни на верхнем уровне, ни на уровне отдельного
вызова удаления. После инициализации Google_Client с помощью моей учетной записи службы, а
затем клиента хранилища с той же информацией, похоже
, заголовок аутентификации должен был быть вставлен на том или ином уровне. Моя учетная запись службы
выполняет следующие роли:
Editor
Firebase Service Management Service Agent
Owner
Service Account Token Creator
Service Account User
Viewer
Я ожидал бы, что у владельца или редактора будет достаточно разрешений, так чего же мне
не хватает в моей настройке?
Ответ №1:
Проблема в том, что у ваших учетных данных нет разрешения. Это вызвано тем, что при создании учетных данных не запрашивается область OAuth.
Измените этот раздел:
$config = [
'projectId' => <MY Project ID>,
'keyFile' => json_decode(file_get_contents( <my json key file> ), true)
];
К этому:
$config = [
'projectId' => <MY Project ID>,
'keyFilePath' => '/path/to/service-account.json',
'scopes ' => ["https://www.googleapis.com/auth/cloud-platform"]
];
Примечание: Я также упростил использование файла ключей.
Комментарии:
1. Спасибо, но это не изменило результатов. Сообщение об ошибке по-прежнему «анонимный абонент», что говорит мне о том, что базовая библиотека по какой-либо причине не включает заголовок авторизации при создании пакета. Согласно исходному коду, если параметр «область действия» не используется, по умолчанию он равен: [ ‘ googleapis.com/auth/iam, самостоятельно::FULL_CONTROL_SCOPE]
Ответ №2:
Итак, похоже, я наткнулся на (а?) решение. В дополнение к вызову setUseBatch для объекта Google_Client, добавьте эти строки после «$google_client->setUseBatch(true)»;:
$google_client->setAuthConfig( <path to json file> );
$google_client->setScopes( [ 'https://www.googleapis.com/auth/cloud-platform' ] );
Похоже, это сработало.