Аутентифікація через OAuth стала стандартом для веб-додатків, дозволяючи користувачам входити в систему за допомогою існуючих облікових записів, наприклад, Google. Laravel Socialite спрощує цей процес, але якщо ви хочете перейти від простого входу до доступу до API Google, наприклад, до Календаря? У цій статті ми розглянемо налаштування Laravel Socialite з Google OAuth та його інтеграцію з Google Client PHP Library.
Спочатку створіть новий проект Laravel та встановіть Socialite:
composer create-project laravel/laravel google
composer require laravel/socialite
Додайте облікові дані Google OAuth до файлу config/services.php
:
'google' => [
'client_id' => env('GOOGLE_CLIENT_ID'),
'client_secret' => env('GOOGLE_CLIENT_SECRET'),
'redirect' => 'http://localhost:8000/auth/callback',
],
Цей етап має багато кроків і може бути трохи заплутаним.
http://localhost:8000/auth/callback
або http://yoursite.test/auth/callback
, якщо використовуєте Laravel Herd)storage/app/private/google/oauth-credentials.json
Налаштуйте маршрути у файлі routes/web.php
для перенаправлення OAuth та обробки зворотного виклику. Я вніс зміни до типової установки, щоб зберігати токени у вигляді файлів і включив маршрут для обробки токенів оновлення:
Route::get('/auth/redirect', function ()
{
return Socialite::driver('google')
->scopes(['https://www.googleapis.com/auth/calendar'])
->with([
'prompt' => 'consent',
])
->redirect();
});
Route::get('/auth/refresh', function ()
{
$refreshToken = Storage::disk('local')->get('google/oauth-refresh-token.json');
$newTokens = Socialite::driver('google')->refreshToken($refreshToken);
if($newTokens->token)
{
Storage::disk('local')->put('google/oauth-token.json', $newTokens->token);
}
if($newTokens->refreshToken)
{
Storage::disk('local')->put('google/oauth-refresh-token.json', $newTokens->refreshToken);
}
return redirect('/gmail');
});
Route::get('/auth/callback', function ()
{
$googleUser = Socialite::driver('google')->user();
Storage::disk('local')->put('google/oauth-token.json', $googleUser->token);
if($googleUser->refreshToken)
{
Storage::disk('local')->put('google/oauth-refresh-token.json', $googleUser->refreshToken);
}
Auth::login($user);
return redirect('/dashboard');
});
Відвідайте http://localhost:8000/auth/redirect
, щоб увійти. Тепер ви повинні побачити екран входу в Google.
Припустимо, ви хочете розширити можливості цього обміну токенами OAuth. Він чудово працював для отримання користувачів у ваш веб-додаток, але тепер ви хочете, щоб користувачі могли бачити події зі свого Google Calendar. Для цього ми змінимо обсяг доступу OAuth так, щоб отримання подій Google Calendar стало можливим. Для цього нам потрібна інша бібліотека.
Щоб отримати дані Google Calendar, потрібно активувати Google Calendar API.
Активуйте Google Calendar API у Google Cloud Console:
Змініть свій маршрут перенаправлення, щоб включити обсяг Calendar:
Route::get('/auth/redirect', function () {
return Socialite::driver('google')
->scopes(['https://www.googleapis.com/auth/calendar'])
->redirect();
});
Примітка: Ви можете переглянути список різних обсягів для продуктів Google на https://developers.google.com/identity/protocols/oauth2/scopes
Тепер, відвідавши /auth/redirect
, ви будете запитані про надання доступу до вашого Google Calendar.
Примітка: Якщо з’явиться помилка 403, додайте себе як тестового користувача у розділі "Google Auth Platform > Audience > Test Users" у Google Cloud Console.
Але що далі? Як отримати дані календаря? Просто мати токен OAuth недостатньо для доступу до даних Google Calendar. Для цього ми потребуємо ще одну бібліотеку.
Я буду використовувати Google APIs Client Library для PHP.
composer require google/apiclient
Створіть новий маршрут для доступу до Google Calendar API. Звісно, може виявитися, що маршрут не є найкращим місцем для цього, але це спрацює.
use Google\Client;
Route::get('/calendar', function ()
{
$client = new Client();
// Витягніть ті ж токени, що використовуються для Socialite
$oathCredentialsPath = Storage::disk('local')->path('google/oauth-credentials.json');
$refreshToken = Storage::disk('local')->get('google/oauth-refresh-token.json');
$oathToken = Storage::disk('local')->get('google/oauth-token.json');
$client->setAuthConfig($oathCredentialsPath);
$client->setAccessToken($oathToken);
$client->addScope(\Google\Service\Calendar::CALENDAR_READONLY);
$service = new \Google_Service_Calendar($client);
$calendar_id = 'youremail@gmail.com';
$opt_params = array(
'maxResults' => 10,
'orderBy' => 'startTime',
'singleEvents' => true,
'timeMin' => date('c'),
);
$results = $service->events->listEvents($calendar_id, $opt_params);
dd($results);
});
Тепер, використовуючи токени, які ви вже отримали через Socialite, ви повинні побачити події Google Calendar, отримані з API.
Для тривалого доступу до API вам потрібно мати токен оновлення. З часом ваш токен доступу закінчиться. Ми створили маршрут /auth/refresh
для оновлення токена, але при відвідуванні цього URL можуть виникнути проблеми. Якщо у вас немає файлу storage/app/private/google/oauth-refresh-token.json
, це не спрацює. Ваш запит OAuth, ймовірно, не повернув токен оновлення.
Примусьте Google надати його, додавши параметр consent
до свого маршруту /auth/redirect
:
Route::get('/auth/redirect', function () {
return Socialite::driver('google')
->scopes(['https://www.googleapis.com/auth/calendar'])
->with([
'prompt' => 'consent',
])
->redirect();
});
Вам не обов'язково перенаправляти користувача на /auth/refresh
для отримання токена оновлення. Ось приклад, як обробити оновлення токена при підключенні до API Google за допомогою винятку.
Ключ до вдалого виконання цього процесу — метод refreshToken()
з Socialite.
try {
// Спроба підключитися до Google API
} catch (\Exception $e) {
// Оновлення токена авторизації Google
$oldRefreshToken = Storage::disk('local')->get('google/oauth-refresh-token.json');
$newTokens = Socialite::driver('google')->refreshToken($oldRefreshToken);
if ($newTokens->token) {
Storage::disk('local')->put('google/oauth-token.json', $newTokens->token);
}
if ($newTokens->refreshToken) {
Storage::disk('local')->put('google/oauth-refresh-token.json', $newTokens->refreshToken);
}
// Спробуйте підключитися ще раз після оновлення токена
}
Поєднавши Laravel Socialite з Google Client PHP Library, ви можете створювати потужні програми, які не лише авторизують користувачів, але й взаємодіють із сервісами Google, такими як Календар. Цей підхід надає вам можливість розширити можливості вашого додатку, зберігаючи при цьому плавний процес авторизації для користувачів. Це може бути для вас ще й більш ефективним.
Пам'ятайте завжди безпечно зберігати токени та реалізувати належну обробку помилок для запитів API, щоб забезпечити безпечний та надійний досвід користувачів.