Для некоторых проектов мы используем Google Диск в качестве хранилища некоторых файлов в проектах Laravel. В этом посте я покажу, как вы можете настроить Google Drive в качестве диска хранения данных с помощью файловой системы Laravel.
Сначала я расскажу, как мы настроили Google Drive в качестве внешнего диска в своем приложении Laravel. После этого покажу процесс создания клиента для Google Drive через Google API console.
В последней главе вы узнаете как можно использовать несколько подключений Google Drive одновременно с отдельными дисками.
Подготовьте приложение Laravel
Для работы с Google Диск я использую внешний пакет nao-pon/flysystem-google-drive
. Версия 1.1 использует Google Drive API V3, который на момент написания статьи не является устаревшим, в то время как Google Drive API v2 является.
composer require nao-pon/flysystem-google-drive:~1.1
С помощью файловой системы Laravel можно настроить несколько дисков хранения, которые могут использоваться в одном приложении, но в этом примере я показываю вам базовую настройку.
В вашем .env файле вам необходимо установить правильные учетные данные для подключения к API Google Drive.
# file: .env
FILESYSTEM_CLOUD=google # need to exists in config/filesystems.php
GOOGLE_DRIVE_CLIENT_ID=xxx.apps.googleusercontent.com
GOOGLE_DRIVE_CLIENT_SECRET=xxx
GOOGLE_DRIVE_REFRESH_TOKEN=xxx
GOOGLE_DRIVE_FOLDER_ID=null
# want to use shared drives/team drive?
# open the shared drive and get the id from the URL
#GOOGLE_DRIVE_TEAM_DRIVE_ID=xxx
В config/filesystems.php вам нужно определить диск хранения, который связывает провайдера с необходимыми учетными данными, хранящимися в вашем .env.
// file: config/filesystems.php
<?php
// ...
'disks' => [
// ...
'google' => [
'driver' => 'google',
'clientId' => env('MAIN_GOOGLE_DRIVE_CLIENT_ID'),
'clientSecret' => env('MAIN_GOOGLE_DRIVE_CLIENT_SECRET'),
'refreshToken' => env('MAIN_GOOGLE_DRIVE_REFRESH_TOKEN'),
'folderId' => env('MAIN_GOOGLE_DRIVE_FOLDER_ID'),
],
// ...
],
// ...
];
Создаем поставщика услуг в app/Providers/GoogleDriveServiceProvider.php, где мы расширяем хранилище с помощью драйвера файловой системы.
// file: app/Providers/GoogleDriveServiceProvider.php
<?php
namespace App\Providers;
use Google_Client;
use Hypweb\Flysystem\GoogleDrive\GoogleDriveAdapter;
use Illuminate\Support\ServiceProvider;
use League\Flysystem\Filesystem;
use Storage;
class GoogleDriveServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
Storage::extend('google', function($app, $config) {
$client = new Google_Client();
$client->setClientId($config['clientId']);
$client->setClientSecret($config['clientSecret']);
$client->refreshToken($config['refreshToken']);
$service = new \Google_Service_Drive($client);
$options = [];
if(isset($config['teamDriveId'])) {
$options['teamDriveId'] = $config['teamDriveId'];
}
$adapter = new GoogleDriveAdapter($service, $config['folderId'], $options);
return new Filesystem($adapter);
});
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}
Нам нужно зарегистрировать наш GoogleDriveServiceProvider в config/app.php.
// file: config/app.php
<?php
return [
// ...
'providers' => [
// ...
App\Providers\GoogleDriveServiceProvider::class,
// ...
],
// ...
];
Теперь ваше приложение Laravel готово к подключению к Google Диску,но для аутентификации вам нужно создать клиента из консоли Google API.
Настройка аутентификации Google API
Эта глава разделена на три отдельные главы.
- Создание клиента Google API
- Получить маркер обновления
- Получить идентификатор папки
1. Создание клиента Google API
Чтобы запросить API-клиент у Google, вам нужно войти в Google Cloud Console и создать проект (если у вас его нет, создание может занять несколько секунд).
Далее вы можете выполнить поиск по “Google Drive API”.
Если у вас нет API Google Drive, включенного в вашем проекте Google Cloud, вам нужно включить его (это может занять несколько секунд).
После того как вы включили API Google Drive, вы будете перенаправлены на страницу, где вы увидите некоторые сведения/статистику Google Drive. Вы должны создать клиент OAuth, это можно сделать на вкладке “учетные данные”.
В верхней части экрана вы можете создать новые учетные данные, вам нужно использовать “OAuth client ID”. Также можно создать “учетную запись службы”, но тогда невозможно аутентифицировать нескольких пользователей. Чтобы использовать его, необходимо добавить” учетную запись службы ” в папку/файл/общий диск.
Вы создаете клиент OAuth для своего использования, поэтому вам не нужно, чтобы он был доступен Google.
В нашем примере мы определили следующие сведения для клиента OAuth.
- Тип приложения: “веб-приложение”
- Название: “web client 3”
- URI: “https://developers.google.com/oauthplayground”
После создания клиента OAuth вы получаете 2 ключа, которые необходимы для аутентификации пользователя пользователя для вашего приложения. Вы должны указать их в .env файле:
MAIN_GOOGLE_DRIVE_CLIENT_ID=xxxxxx.apps.googleusercontent.com
MAIN_GOOGLE_DRIVE_CLIENT_SECRET=xxxxxxx
“CLIENT_SECRET” виден только один раз, после того как вы закрыли модал, его больше невозможно увидеть.
Теперь клиент создан, и вы можете перейти к следующему шагу, где вы выполняете фактическую аутентификацию.
2, Получаем refresh_token
Чтобы получить refresh_token, мы используем Google OAuth playground, это простой способ проверить и получить ваши учетные данные аутентификации для подключения к API Google.
Перейти к developers.google.com/oauthplayground и настройте площадку для использования вашего клиента Google API, созданного на шаге 1.
Далее вам нужно выбрать необходимый API (“Drive API V3” > “https://www.googleapis.com/auth/drive”) и нажмите на кнопку” авторизовать API”. Это перенаправит вас на экран, где вы даете разрешения клиенту (созданному на шаге 1) для доступа к вашему Google Диску.
Вы можете увидеть экран: “клиент OAuth не проверен Google и может быть небезопасен, вы уверены, что хотите продолжить”. Вы можете продолжать, потому что вы сами сделали клиента.
После аутентификации вы будете перенаправлены на площадку OAuth, где увидите заполненный “код авторизации”, это код, действительный в течение 30 секунд. Этот код можно использовать один раз, чтобы получить refresh_token и access_token.
Это можно сделать с помощью “кода авторизации обмена токенами”.
Вы получите “refresh_token “и”access_token”. “Access_token” можно использовать в течение 3600 секунд, и после этого он больше не действителен.
С помощью “refresh_token” вы можете получить новый “access_token”, действительный в течение следующих 3600 секунд.
Скопируйте “access_token” в свой .env-файл (в примере мы используем ключ MAIN_GOOGLE_DRIVE_REFRESH_TOKEN
). Пакет использует этот ключ для получения access_token для подключения к вашему Google Диску через API.
3. Получаем идентификатор папки
Чтобы выбрать, в какой папке (или общем диске) на Google Диске ваше приложение должно хранить свои данные, вы должны указать идентификатор папки. Этот идентификатор папки вы можете получить из URL-адреса в Google Диске. Поэтому вы идете в drive.google.com, выберите нужное место и посмотрите на URL-адрес. Возьмите часть, выделенную на следующих изображениях, и сохраните их в своем .env файл.
В нашем случае это идентификатор папки: “1jH09RbtkNC8dvpo_Xji8eAVhlTh5-T0f
“.
С этого момента ваше приложение может использовать эту папку в качестве диска в вашем приложении.
Вы можете установить основной облачный диск через .env:
FILESYSTEM_CLOUD=google
Или вы можете использовать его программно в своих приложениях:
Storage::disk('google')->allFiles()
Использование общих дисков
Если вы хотите использовать общие диски (или командные диски), вы должны указать дополнительный параметр “teamDriveId” в конфигурации. Конфигурация может выглядеть следующим образом:
// file: config/filesystems.php
<?php
// ...
'disks' => [
// ...
'google' => [
'driver' => 'google',
'clientId' => env('MAIN_GOOGLE_DRIVE_CLIENT_ID'),
'clientSecret' => env('MAIN_GOOGLE_DRIVE_CLIENT_SECRET'),
'refreshToken' => env('MAIN_GOOGLE_DRIVE_REFRESH_TOKEN'),
'folderId' => env('MAIN_GOOGLE_DRIVE_FOLDER_ID'),
'teamDriveId' => env('MAIN_GOOGLE_DRIVE_TEAM_DRIVE_ID'),
],
// ...
],
// ...
];
Использование нескольких подключений Google Drive одновременно
В приложениях Laravel можно одновременно использовать несколько подключений Google Drive. Поэтому вам нужно добавить второй диск в config/filesystems.php. Например, это может выглядеть так:
// file: config/filesystems.php
<?php
// ...
'disks' => [
// ...
'google' => [
'driver' => 'google',
'clientId' => env('MAIN_GOOGLE_DRIVE_CLIENT_ID'),
'clientSecret' => env('MAIN_GOOGLE_DRIVE_CLIENT_SECRET'),
'refreshToken' => env('MAIN_GOOGLE_DRIVE_REFRESH_TOKEN'),
'folderId' => env('MAIN_GOOGLE_DRIVE_FOLDER_ID'),
],
'second_google' => [
'driver' => 'google',
'clientId' => env('SECOND_GOOGLE_DRIVE_CLIENT_ID'),
'clientSecret' => env('SECOND_GOOGLE_DRIVE_CLIENT_SECRET'),
'refreshToken' => env('SECOND_GOOGLE_DRIVE_REFRESH_TOKEN'),
'folderId' => env('SECOND_GOOGLE_DRIVE_FOLDER_ID'),
],
// ...
],
// ...
];
И после того, как вы установите правильные учетные данные SECOND_GOOGLE диска в вашем .env вы можете использовать второй диск в качестве:
Storage::disk('second_google')->allFiles();