Я внедряю 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, я работаю на личном движке.
У кого-нибудь есть идея?
Хорошего дня и счастливого Нового года!
Бен.
Причина, по которой вы получаете ошибку 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 Вот. Я надеюсь, что эта информация будет полезной.
Других решений пока нет …