Socialite реалізує протокол OAuth для входу через сторонніх провайдерів: Google, GitHub, Facebook, GitLab, LinkedIn, Slack, X та інших.
Як проходить вхід:
- користувач натискає «Увійти через GitHub» - застосунок перенаправляє його на GitHub;
- GitHub питає користувача, чи дозволити доступ;
- GitHub повертає користувача на ваш callback-маршрут з одноразовим кодом;
- Socialite обмінює код на токен доступу й отримує профіль користувача;
- застосунок знаходить чи створює користувача і входить від його імені.
Налаштування - ключі застосунку провайдера в config/services.php:
'github' => [
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
'redirect' => '/auth/github/callback',
],
Два маршрути:
use Laravel\Socialite\Socialite;
Route::get('/auth/github/redirect', fn () => Socialite::driver('github')->redirect());
Route::get('/auth/github/callback', function () {
$githubUser = Socialite::driver('github')->user();
$user = User::updateOrCreate(
['github_id' => $githubUser->getId()],
['name' => $githubUser->getName(), 'email' => $githubUser->getEmail()],
);
Auth::login($user, remember: true);
return redirect('/dashboard');
});
Що варто знати:
- шукати користувача за ID провайдера (
github_id), а не за email: email у профілі можна змінити, а ID стабільний; - email може бути відсутнім - деякі провайдери не повертають його без додаткового скопу або якщо користувач приховав пошту;
- скопи визначають, до чого застосунок отримає доступ:
->scopes(['read:user']). Просіть мінімум; - параметр
stateSocialite перевіряє сам - це захист від CSRF у процесі OAuth. Для API без сесії єstateless(), але тоді захист доведеться забезпечити інакше; - тести: Socialite можна підмінити фейком і не ходити до справжнього провайдера.
Для кількох провайдерів зручно зберігати зв'язки в окремій таблиці social_accounts (provider, provider_id, user_id), а не додавати колонку в users для кожного провайдера.
Докладніше в документації: Socialite: автентифікація та збереження