Інтеграція Laravel Socialite з бібліотекою Google Client PHP

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 22 березня, 2025
Ви хочете навчитися, як інтегрувати Google OAuth у вашому проекті Laravel, використовуючи Socialite? Дізнайтеся, як налаштувати доступ до сервісів Google, таких як Календар, у нашій сьогоднішній статті

Аутентифікація через OAuth стала стандартом для веб-додатків, дозволяючи користувачам входити в систему за допомогою існуючих облікових записів, наприклад, Google. Laravel Socialite спрощує цей процес, але якщо ви хочете перейти від простого входу до доступу до API Google, наприклад, до Календаря? У цій статті ми розглянемо налаштування Laravel Socialite з Google OAuth та його інтеграцію з Google Client PHP Library.

# Налаштування Laravel Socialite

Спочатку створіть новий проект 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',
],

# Створення облікових даних Google OAuth

Цей етап має багато кроків і може бути трохи заплутаним.

  1. Перейдіть до Google Cloud Console
  2. Обрати "APIs & Services > Credentials"
  3. Налаштуйте екран згоди OAuth, якщо ви цього ще не зробили
  4. Натисніть "Create Credentials" та виберіть "OAuth client ID"
  5. Оберіть "Web Application" як тип програми та дайте їй ім'я
  6. Додайте авторизовану URI перенаправлення (наприклад, http://localhost:8000/auth/callback або http://yoursite.test/auth/callback, якщо використовуєте Laravel Herd)
  7. Після створення ви отримаєте Client ID та Client Secret. Додайте їх до свого файлу .env як GOOGLE_CLIENT_ID та GOOGLE_CLIENT_SECRET. Також завантажте файл з обліковими даними у форматі JSON. Натисніть "Download JSON", щоб отримати цей файл.
  8. Перейменуйте новий JSON файл на oauth-credentials.json та помістіть його в storage/app/private/google/oauth-credentials.json

# Основна реалізація Socialite

Налаштуйте маршрути у файлі 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. Для цього ми змінимо обсяг доступу OAuth так, щоб отримання подій Google Calendar стало можливим. Для цього нам потрібна інша бібліотека.

Щоб отримати дані Google Calendar, потрібно активувати Google Calendar API.

  1. Активуйте Google Calendar API у Google Cloud Console:

    • Перейдіть до "APIs & Services > Library"
    • Знайдіть та активуйте Google Calendar API
  2. Змініть свій маршрут перенаправлення, щоб включити обсяг 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.

# Підключення до Google Client PHP Library

Але що далі? Як отримати дані календаря? Просто мати токен 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, щоб забезпечити безпечний та надійний досвід користувачів.