Laravel Socialite
Вступ
На додаток до типової аутентифікації на основі форм, Laravel також надає простий і зручний спосіб аутентифікації з використанням OAuth провайдерів за допомогою Laravel Socialite. Socialite наразі підтримує аутентифікацію через Facebook, X, LinkedIn, Google, GitHub, GitLab, Bitbucket та Slack.
Адаптери для інших платформ доступні через сайт Socialite Providers, керований спільнотою.
Встановлення
Щоб почати з Socialite, використовуйте менеджер пакетів компонувальник, щоб додати пакет до залежностей вашого проєкту:
composer require laravel/socialite
Оновлення Socialite
Коли ви оновлюєтеся до нової основної версії Socialite, важливо ретельно переглянути посібник з оновлення.
Конфігурація
Перед використанням Socialite, вам потрібно додати облікові дані для OAuth-провайдерів, які використовує ваш застосунок. Зазвичай ці облікові дані можна отримати, створивши "застосунок розробника" в панелі керування сервісу, з яким ви будете здійснювати автентифікацію.
Ці облікові дані слід розмістити у файлі конфігурації вашого застосунку config/services.php і використовувати ключ facebook, x, linkedin-openid, google, github, gitlab, bitbucket, slack або slack-openid, залежно від провайдерів, які потребує ваш застосунок:
'github' => [
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
'redirect' => 'http://example.com/callback-url',
],
Якщо параметр redirect містить відносний шлях, він автоматично буде перетворений на повністю кваліфіковану URL-адресу.
Аутентифікація
Маршрутизація
Щоб автентифікувати користувачів за допомогою провайдера OAuth, вам знадобляться два маршрути: один для перенаправлення користувача до провайдера OAuth, і інший для отримання зворотного виклику від провайдера після автентифікації. Приклад маршрутів нижче демонструє реалізацію обох маршрутів:
use Laravel\Socialite\Facades\Socialite;
Route::get('/auth/redirect', function () {
return Socialite::driver('github')->redirect();
});
Route::get('/auth/callback', function () {
$user = Socialite::driver('github')->user();
// $user->token
});
Метод redirect, наданий фасадом Socialite, відповідає за перенаправлення користувача до постачальника OAuth, тоді як метод user перевіряє вхідний запит і отримує інформацію про користувача від постачальника після того, як вони схвалили запит на автентифікацію.
Аутентифікація та Зберігання
Після того, як користувача отримано від постачальника OAuth, ви можете визначити, чи існує користувач у базі даних вашого застосунку і автентифікувати користувача. Якщо користувач не існує в базі даних вашого застосунку, зазвичай ви створюєте новий запис у вашій базі даних для представлення користувача:
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Laravel\Socialite\Facades\Socialite;
Route::get('/auth/callback', function () {
$githubUser = Socialite::driver('github')->user();
$user = User::updateOrCreate([
'github_id' => $githubUser->id,
], [
'name' => $githubUser->name,
'email' => $githubUser->email,
'github_token' => $githubUser->token,
'github_refresh_token' => $githubUser->refreshToken,
]);
Auth::login($user);
return redirect('/dashboard');
});
Для отримання додаткової інформації про те, які дані користувача доступні від конкретних OAuth-провайдерів, будь ласка, зверніться до документації про отримання деталей користувача.
Доступні Області
Перед перенаправленням користувача, ви можете використовувати метод scopes для вказівки "областей", які повинні бути включені в запит аутентифікації. Цей метод об'єднає всі раніше вказані області з тими, які ви вказуєте:
use Laravel\Socialite\Facades\Socialite;
return Socialite::driver('github')
->scopes(['read:user', 'public_repo'])
->redirect();
Ви можете перезаписати всі існуючі області на запиті автентифікації, використовуючи метод setScopes:
return Socialite::driver('github')
->setScopes(['read:user', 'public_repo'])
->redirect();
Slack Bot Scopes
API Slack надає різні типи токенів доступу, кожен з власним набором дозволених областей. Socialite сумісний з обома наступними типами токенів доступу Slack:
- Бот (з префіксом
xoxb-) - Користувач (з префіксом
xoxp-)
За замовчуванням, драйвер slack згенерує токен user, і виклик методу user драйвера поверне деталі користувача.
Токени ботів в основному корисні, якщо ваш застосунок буде надсилати сповіщення до зовнішніх робочих просторів Slack, які належать користувачам вашого застосунку. Щоб згенерувати токен бота, викличте метод asBotUser перед перенаправленням користувача до Slack для автентифікації:
return Socialite::driver('slack')
->asBotUser()
->setScopes(['chat:write', 'chat:write.public', 'chat:write.customize'])
->redirect();
Крім того, ви повинні викликати метод asBotUser перед викликом методу user після того, як Slack перенаправить користувача назад до вашого застосунку після автентифікації:
$user = Socialite::driver('slack')->asBotUser()->user();
Коли генерується токен бота, метод user все ще повертатиме екземпляр Laravel\Socialite\Two\User; однак, лише властивість token буде заповнена. Цей токен може бути збережений для того, щоб надсилати сповіщення до Slack робочих просторів автентифікованого користувача.
Необов'язкові параметри
Деякі постачальники OAuth підтримують інші необов'язкові параметри в запиті перенаправлення. Щоб включити будь-які необов'язкові параметри в запит, викличте метод with з асоціативним масивом:
use Laravel\Socialite\Facades\Socialite;
return Socialite::driver('google')
->with(['hd' => 'example.com'])
->redirect();
Коли використовуєте метод with, будьте обережні, щоб не передавати жодних зарезервованих ключових слів, таких як state або response_type.
Отримання деталей користувача
Після того, як користувач буде перенаправлений назад до маршруту зворотного виклику автентифікації вашого застосунку, ви можете отримати деталі користувача, використовуючи метод Socialite user. Об'єкт користувача, повернутий методом user, надає різноманітні властивості та методи, які ви можете використовувати для збереження інформації про користувача у власній базі даних.
Різні властивості та методи можуть бути доступні на цьому об'єкті залежно від того, чи підтримує постачальник OAuth, з яким ви аутентифікуєтеся, OAuth 1.0 або OAuth 2.0:
use Laravel\Socialite\Facades\Socialite;
Route::get('/auth/callback', function () {
$user = Socialite::driver('github')->user();
// OAuth 2.0 providers...
$token = $user->token;
$refreshToken = $user->refreshToken;
$expiresIn = $user->expiresIn;
// OAuth 1.0 providers...
$token = $user->token;
$tokenSecret = $user->tokenSecret;
// All providers...
$user->getId();
$user->getNickname();
$user->getName();
$user->getEmail();
$user->getAvatar();
});
Отримання даних користувача з токена
Якщо у вас вже є дійсний токен доступу для користувача, ви можете отримати деталі користувача за допомогою методу Socialite userFromToken:
use Laravel\Socialite\Facades\Socialite;
$user = Socialite::driver('github')->userFromToken($token);
Якщо ви використовуєте Facebook Limited Login через iOS-застосунок, Facebook поверне OIDC-токен замість токена доступу. Як і токен доступу, OIDC-токен може бути наданий методу userFromToken для отримання деталей користувача.
Безстанова аутентифікація
Метод stateless може бути використаний для відключення перевірки стану сесії. Це корисно при додаванні соціальної автентифікації до API без стану, яке не використовує сесії на основі cookie:
use Laravel\Socialite\Facades\Socialite;
return Socialite::driver('google')->stateless()->user();
