Аутентифікація потрібна багатьом застосункам, і в Laravel є безліч готових рішень. Якщо шукаєте альтернативу — PropelAuth вартий уваги. Існує PropelAuth Socialite Provider, а розробник Elliot Ali створив пакет для Laravel під назвою Earhart, що ще більше спрощує інтеграцію.
Можливості
- Інтеграція з Laravel Socialite
- Попередньо налаштовані маршрути та контролери для роботи з PropelAuth Accounts, Organizations і Members
- Контролер для обробки webhook-запитів від PropelAuth, який генерує події, на які можна підписатися в додатку.
Короткий приклад
Як і з іншими Socialite-провайдерами, спочатку потрібно зареєструватися в PropelAuth і виконати базову конфігурацію. Зокрема, створити OAuth2-провайдера в PropelAuth та скопіювати Client ID і Client Secret. Дотримуйтесь інструкцій у PropelAuth документації для налаштування цього OAuth-провайдера.
Після цього додайте в файл .env такі змінні середовища з відповідними значеннями:
PROPELAUTH_CLIENT_ID="tbc"
PROPELAUTH_CLIENT_SECRET="tbc"
PROPELAUTH_CALLBACK_URL=https://localhost:8000/auth/callback
PROPELAUTH_AUTH_URL=https://0000000000.propelauthtest.com
PROPELAUTH_SVIX_SECRET="whsec_tbd"
PROPELAUTH_API_KEY="tbc"
У файлі config/services.php додайте:
'propelauth' => [
'client_id' => env('PROPELAUTH_CLIENT_ID'),
'client_secret' => env('PROPELAUTH_CLIENT_SECRET'),
'redirect' => env('PROPELAUTH_CALLBACK_URL'),
'auth_url' => env('PROPELAUTH_AUTH_URL'),
'svix_secret' => env('PROPELAUTH_SVIX_SECRET'),
'api_key' => env('PROPELAUTH_API_KEY'),
]
Після налаштування можна додати посилання для входу у Blade-шаблон, використавши маршрут auth.redirect. Він перенаправить користувачів на сторінку входу PropelAuth (яку можна налаштувати в PropelAuth Dashboard).
<a href="{{ route('auth.redirect') }}">Login</a>
Хоча пакет бере на себе частину шаблонного коду для інтеграції з PropelAuth, вам усе одно потрібно створити маршрут /auth/callback, який після успішного входу збереже користувача в базі вашого застосунку.
Маршрут може виглядати так:
Route::get('/auth/callback', function(Request $request) {
$propelUser = Socialite::driver('propelauth')->user();
$rawUser = $propelUser->getRaw();
$user = User::updateOrCreate([
'propel_id' => $propelUser->id,
], [
'name' => $rawUser['first_name'] . ' ' . $rawUser['last_name'],
'email' => $propelUser->email,
'propel_access_token' => $propelUser->token,
'propel_refresh_token' => $propelUser->refreshToken,
'avatar' => $rawUser['picture_url'],
'data' => json_encode($rawUser),
'email_verified_at' => $rawUser['email_confirmed'] ? now() : null,
]);
Auth::login($user);
return redirect('/dashboard');
})->name('auth.callback');
У прикладі використано $propelUser->getRaw(). За замовчуванням Socialite-драйвер для PropelAuth повертає лише email, id та токени. Якщо потрібні додаткові дані про користувача (наприклад, щоб заповнити інші поля в базі), можна отримати сирий масив користувача.
Потрібно також додати маршрут /auth/logout, який інвалідує refresh_token, отриманий під час входу, і виконає вихід користувача:
Route::get('/auth/logout', function(Request $request){
$response = Http::withHeaders([
'Content-Type' => 'application/json',
])->post(config('services.propelauth.auth_url') . '/api/backend/v1/logout', [
'refresh_token' => Auth::user()->propel_refresh_token,
]);
if ($response->failed()) {
Log::debug('Failed to log out from PropelAuth', ['response' => $response->body()]);
}
Auth::logout();
return redirect('/');
})->name('auth.logout');
Так само додайте в Blade-шаблон посилання для виходу:
<a href="{{ route('auth.logout') }}">Logout</a>
Детальніше про пакет (включно з іншими маршрутами та подіями) та вихідний код дивіться на GitHub.