Junior: питання на співбесіді з теми «Автентифікація»
Питання з реальних співбесід з відповідями: Laravel і PHP, бази даних, JavaScript і фронтенд, Git, Docker, API, безпека й архітектура. Тими самими темами, що й тести.
3 питання
Верифікація email підтверджує, що користувач справді володіє вказаною адресою. Laravel має це з коробки.
// 1. Модель реалізує контракт
class User extends Authenticatable implements MustVerifyEmail {}
// 2. Маршрути захищають middleware
Route::get('/dashboard', ...)->middleware(['auth', 'verified']);
Як працює: після реєстрації Laravel шле лист із підписаним URL (signed URL), перехід за яким ставить email_verified_at. Middleware verified не пускає непідтверджених користувачів. Подія Registered автоматично тригерить відправку листа.
Auth::attempt() перевіряє облікові дані й, якщо вони правильні, відкриває сесію.
public function login(LoginRequest $request): RedirectResponse
{
if (! Auth::attempt($request->only('email', 'password'), $request->boolean('remember'))) {
throw ValidationException::withMessages(['email' => __('auth.failed')]);
}
$request->session()->regenerate();
return redirect()->intended('/dashboard');
}
Покроково:
- Провайдер гарда шукає користувача за всіма полями, крім пароля.
- Пароль порівнюється з хешем через
Hash::check()- відкритий пароль ніде не зберігається й не порівнюється напряму. - При успіху ID користувача записується в сесію, і наступні запити бачать його через
auth()->user().
Що робиться після входу:
session()->regenerate()- новий ідентифікатор сесії, щоб підкинутий заздалегідь не дав зловмиснику увійти разом з жертвою (session fixation).redirect()->intended()- повертає туди, куди користувач ішов до перенаправлення на логін.
Додаткові умови передають тим самим масивом: Auth::attempt([...$credentials, 'is_active' => true]) не пустить вимкнений акаунт. У стартових наборах Laravel 13 усе це вже зроблено пакетом Fortify.
Звичайна сесія закінчується через SESSION_LIFETIME хвилин бездіяльності. «Запам'ятати мене» дозволяє лишатися в системі довше - без повторного входу.
Auth::attempt($credentials, remember: true);
Як це влаштовано: Laravel генерує випадковий токен, зберігає його в колонці users.remember_token і ставить довгоживучу зашифровану cookie. Коли сесія вже закінчилась, а cookie є, користувача автентифікують за нею, і Auth::viaRemember() повертає true.
Ризики й що з ними роблять:
- Вкрадена cookie = доступ на весь термін її дії. Тому cookie має
HttpOnlyіSecure(через HTTPS), а на чутливих діях пароль запитують ще раз - middlewarepassword.confirm. - Спільний комп'ютер. Галочка на бібліотечному ПК лишить акаунт відкритим для наступного. Тому вона не має бути ввімкнена за замовчуванням.
- Вихід скидає токен.
Auth::logout()оновлюєremember_token, і стара cookie перестає працювати - тож «вийти» справді виходить.
Якщо viaRemember() повертає true, розумно обмежити найнебезпечніші дії, доки людина не підтвердить пароль.