Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

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 автоматично тригерить відправку листа.

Докладніше в документації: Верифікація email

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');
}

Покроково:

  1. Провайдер гарда шукає користувача за всіма полями, крім пароля.
  2. Пароль порівнюється з хешем через Hash::check() - відкритий пароль ніде не зберігається й не порівнюється напряму.
  3. При успіху 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), а на чутливих діях пароль запитують ще раз - middleware password.confirm.
  • Спільний комп'ютер. Галочка на бібліотечному ПК лишить акаунт відкритим для наступного. Тому вона не має бути ввімкнена за замовчуванням.
  • Вихід скидає токен. Auth::logout() оновлює remember_token, і стара cookie перестає працювати - тож «вийти» справді виходить.

Якщо viaRemember() повертає true, розумно обмежити найнебезпечніші дії, доки людина не підтвердить пароль.

Докладніше в документації: Запам'ятовування користувачів