Загрузка файлов на Cloud Storage с помощью Google APIs Client Library for PHP

Делюсь рецептом использования Google APIs Client Library for PHP, в частности для сервиса Google Cloud Storage.

Я использую Cloud Storage как дешевое/бесплатное, высокопроизводительное хранилище статических файлов (картинок, js, css и пр.) в своих новых проектах, этакий CDN, что позволяет разгрузить, очистить основной сервер сайта/приложения от этой задачи.

Итак, направляемся в Google Developers Console (надеюсь у вас уже есть аккаунт в Google 🙂

Projects → Create Project, к примеру «My Project»

Создаем bucket

Заходим в только что созданный «My Project». Добавляем bucket, к примеру «My bucket»

Storage → Cloud Storage → Storage browser → Add bucket

Bucket являются основными контейнерами, содержащими ваши данные. Все, что вы храните в Google Cloud Storage, должны содержаться в bucket. Вы можете использовать bucket, чтобы организовать свои данные и контролировать доступ к вашим данным, но в отличие от каталогов и папок, вы не можете создавать вложенные bucket. Bucket относятся к одному проекту и не могут быть распределены между другими проектами. Нет ограничения на количество bucket, которые можно создать в проекте.

Создаем Client Id и «крендельки» OAuth 2.0

OAuth 2.0 позволяет пользователям обмениваться конкретными данными с вами (например, списки контактов), сохраняя при этом их логины, пароли и другую информацию приватной.

В меню нашего «My Project» → APIs & auth → Credentials → OAuth → Create new Client ID → Service account → Configure consent screen
Сохраните .p12-файл ключ, он понадобится (хотя позже можно сгенерировать другой, нажав Generate new P12 key), также понадобятся данные из появившейся таблицы Service Account (CLIENT ID, EMAIL ADDRESS)

В чем различия APPLICATION TYPE

Web application — доступ через браузер, авторизация через ввода логина/пароля аккаунта в гугл и редиректа к приложению.

Service account — доступ через вызовы Google APIs, без действий юзера, например PHP-скриптом как у нас.

Installed application — для десктопных или мобильных приложений.

Все необходимое есть, теперь подключаем гугловскую либу

и вводим параметры доступа Service Account

require_once 'google-api-php-client/autoload.php'; // or wherever autoload.php is located
$client = new Google_Client();
$client->setApplicationName('My App Name');
$client->setClientId('CLIENT ID'); // имеет вид 12345678910-fb2vu7ipertbg3t73shtu2m30b838756.apps.googleusercontent.com, получили ранее
$client->setScopes('https://www.googleapis.com/auth/devstorage.full_control');
$privateKey = file_get_contents('P12_KEY_FILE_PATH_.p12'); // получаем контент .p12 файла, который получили ранее
$client->setAssertionCredentials(new Google_Auth_AssertionCredentials(
'EMAIL ADDRESS', // имеет вид 12345678910-fb2vu7ipertbg3t73shtu2m30b838756@developer.gserviceaccount.com, получили ранее
array('https://www.googleapis.com/auth/devstorage.full_control'),
$privateKey
));
Создаем объект Google_Service_Storage

и получаем его «objects»

$storageService = new Google_Service_Storage($client);
$objects = $storageService->objects;

Objects — понятие в Google Cloud Storage как и bucket, отдельные части данных, которые вы храните в Cloud Storage. Объекты имеют две составляющие: объект данных (data), и метаданные объекта (metadata ). Компонент данных объекта, как правило, файл, который вы хотите хранить в Google Cloud Storage. Компонент объект метаданные представляет собой набор пар имя-значение, которые описывают различные свойства объекта. Objects принадлежат bucket и не могут быть распределены между разными bucket. Нет ограничения на количество objects, которые можно создать в bucket.

Создаем объект Object и вставляем его в bucket
$object = new Google_Service_Storage_StorageObject();
$object->setName('FILE_NAME'); // имя файла в bucket
$r = $objects->insert(
        'My bucket', $object, array(
    'data' => file_get_contents('FILE_PATH'), // контент файла
    'uploadType' => 'media',
    'contentEncoding' => CFileHelper::getMimeType('FILE_PATH'), // MIME-тип файла, в этом примере для этого используется класс CFileHelper из Yii2
    'mimeType' => CFileHelper::getMimeType('FILE_PATH'), // то же самое, так же вы можете установить универсальный application/octet-stream
    'predefinedAcl' => 'publicread' // присваиваем предопределенный ACL public-read
        )
);

Google Cloud Storage использует списки контроля доступа (ACL) для управления bucket и доступа к объектам. Списки контроля доступа (ACL) — механизм, для разграничения доступа к bucket и objects.
public-read (publicRead) — права на чтение всем пользователям, в том числе без аутентификации.