Облачное хранилище Google с учетной записью службы — 403 Запрещено

Я внедряю cron, автоматически загружающий статистику установки моего приложения в Google Play Store. Итак, мне нужно скачать файл из Google Cloud Storage и проанализировать его. Я сделал этот код:

// Set scopes to authorize full control of Cloud Storage

$scopes = array("https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/devstorage.full_control");// Create new Google Client

$client = new Google_Client();// Set path to ServiceAccount's credentials and link them to Google Client

putenv('GOOGLE_APPLICATION_CREDENTIALS=../../libs/GoogleAPICredentials/client_credentials_CPTS.json');
$client->useApplicationDefaultCredentials();
$client->setScopes($scopes);// Create new Google Service Storage object to handle our repository

$service = new Google_Service_Storage($client);// Get content of GCS repository

$request = $service->objects->listObjects("MY_BUCKET");// Settings folders, files, buckets, names

$sourceBucket = "pubsite_prod_rev_BUCKET_IDENTIFIER";
$sourceObject = "installs_MY_APP_IDENTIFIER_" . $date->format("Ym") . "_overview.csv";
$localFile = "../files/temp/installs_MY_APP_IDENTIFIER_" . $date->format("Ym") . "_overview.csv";
$fullSrcObj = "stats/installs/" . $sourceObject;
$destinationBucket = "MY_BUCKET";
$destinationObject = $sourceObject;// Create new Google Service Storage StorageObject object to handle a single object (file)

$postBody = new Google_Service_Storage_StorageObject($client);try {
// Copy stats app .CSV file from orignal repository (Google Play Store) to our bucket

$response = $service->objects->copy($sourceBucket, $fullSrcObj, $destinationBucket, $destinationObject, $postBody);// Get the new object

try {
$object = $service->objects->get($destinationBucket, $destinationObject);
}
catch (Google_Service_Exception $e) {
if ($e->getCode() == 404)
echo ("[<b><span style=\"color:#DA4F34\">ERROR</span></b>] <b><span style=\"color:#DA4F34\">". $e->getMessage() ."</span></b><br><br>");
throw $e;
}// Download the new object on the MY_COMPAGNY server

$uri = sprintf('https://storage.googleapis.com/%s/%s?alt=media&generation=%s', $destinationBucket, $destinationObject, $object->generation);
$http = $client->authorize();
$response = $http->get($uri);

if ($response->getStatusCode() != 200) {
echo ("[<b><span style=\"color:#DA4F34\">ERROR</span></b>] <b><span style=\"color:#DA4F34\">An unhandled error append !</span></b><br><br>");
die();
}// Save it into local file on MY_COMPAGNY server

file_put_contents($localFile, $response->getBody());// Convert .CSV into php array

$csv = array_map('str_getcsv', file($localFile));// Delete local file

unlink($localFile);// Remove last line of CSV (Array) --> Empty - And remove first line of CSV (Array) --> Title line

array_shift($csv);
array_pop($csv);// Insert each line into MY_COMPAGNY Database

$success = false;
foreach ($csv as $row) {
$success = insertAppInstallData(filter_var($row[0], FILTER_SANITIZE_STRING), (int)filter_var($row[$columnTotal], FILTER_SANITIZE_NUMBER_INT), (int)filter_var($row[$columnCurrent], FILTER_SANITIZE_NUMBER_INT))?true:  $success;
}
if (!$success)
echo ("[<b><span style=\"color:#DA4F34\">ERROR</span></b>] <b><span style=\"color:#DA4F34\">DataBase insertion failure</span></b><br><br>");

}
catch (Google_Service_Exception $E) {
echo ("[<b><span style=\"color:#DA4F34\">ERROR</span></b>] <b><span style=\"color:#DA4F34\">".$E->getMessage()." - ".$E->getTraceAsString()."</span></b><br><br>");
}

С учетной записью пользователя, это работает хорошо, но с учетной записью службы, у меня ошибка 403, запрещено при вызове $ Сервис-> объекты-> копия ().

{
"error":
{
"errors": [
{
"domain": "global",
"reason": "forbidden",
"message": "Forbidden"}],
"code": 403,
"message": "Forbidden"}
}

Я дважды проверяю, есть ли хорошие учетные данные, авторизация IAM, клиент OAuth, … и это все еще не работает.

Я не на движке Google, я работаю на личном движке.

У кого-нибудь есть идея?

Хорошего дня и счастливого Нового года!

Бен.

2

Решение

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

Процесс такой:

$scopes = array("https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/devstorage.full_control");

$client = new Google_Client();
$client->useApplicationDefaultCredentials();
$client->addScope($scopes); //Set scopes to client object
$client->setSubject("[email protected]"); // replace with the user account

Вы можете заставить его работать с учетной записью пользователя, поскольку пользователь уже имеет доступ к ресурсу, но не к учетной записи службы, поэтому ошибка 403 запрещена. К сожалению, процесс делегирования домена и олицетворение пользователей работают только с учетными записями G Suite (ранее Google Apps). Другой альтернативой может быть совместное использование ресурсов с учетной записью службы, но это то, что я еще не исследовал и не уверен, возможно ли это. Вы также можете обратиться к документации по PHP Client Lib Вот. Я надеюсь, что эта информация будет полезной.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]