php:google 云批处理操作未发送身份验证 headers

php: google cloud batch operations not sending authentication headers

我在使用 Google 云批处理操作进行身份验证时遇到问题 PHP 图书馆。我特别想批量删除 Cloud Storage objects。 我正在这样设置:

use Google\Cloud\Storage\StorageClient;

$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();

batch->execute() 的结果是:

"Anonymous caller does not have storage.objects.delete access to the Google Cloud Storage object."

在创建的批处理上转储一些调试信息,我看不到 authentication headers 要么在顶层,要么在个人 delete 调用级别。使用我的服务帐户初始化 Google_Client 后,并且 然后是具有相同信息的 StorageClient,似乎是身份验证 header 应该在一个级别或另一个级别插入。我的服务帐户有 以下角色:

Editor
Firebase Service Management Service Agent
Owner
Service Account Token Creator
Service Account User
Viewer

我希望 Owner 或 Editor 有足够的权限,所以我是什么 我的设置中缺少?

问题是您的凭据没有权限。这是由于在创建凭据时未请求 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"]
];

注意:我还简化了密钥文件的使用。

Documentation reference

好的,所以我似乎偶然发现了(一个?)解决方案。除了在 Google_Client 对象上调用 setUseBatch 之外,在“$google_client->setUseBatch(true);”之后添加这些行:

$google_client->setAuthConfig( <path to json file> );
$google_client->setScopes( [ 'https://www.googleapis.com/auth/cloud-platform' ] );

看来成功了。