php: пакетные операции google cloud не отправляют заголовки аутентификации

# #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' ] );
 

Похоже, это сработало.