Laravel Fortify

Вступ

Laravel Fortify є реалізацією бекенду автентифікації для Laravel, яка не залежить від фронтенду. Fortify реєструє маршрути та контролери, необхідні для реалізації всіх функцій автентифікації Laravel, включаючи вхід, реєстрацію, скидання пароля, верифікацію електронної пошти та інше. Після встановлення Fortify, ви можете виконати команду Artisan route:list, щоб побачити маршрути, які зареєстрував Fortify.

Оскільки Fortify не надає власного інтерфейсу користувача, він призначений для використання з вашим власним інтерфейсом користувача, який надсилає запити до маршрутів, які він реєструє. Ми обговоримо, як саме надсилати запити до цих маршрутів у решті цієї документації.

Пам'ятайте, Fortify - це пакет, який призначений для того, щоб дати вам фору у впровадженні функцій аутентифікації Laravel. Ви не зобов'язані його використовувати. Ви завжди можете вручну взаємодіяти з сервісами аутентифікації Laravel, дотримуючись документації, доступної в розділах аутентифікація, скидання пароля та верифікація електронної пошти.

Що таке Fortify?

Як згадувалося раніше, Laravel Fortify є незалежною від фронтенду реалізацією бекенду аутентифікації для Laravel. Fortify реєструє маршрути та контролери, необхідні для реалізації всіх функцій аутентифікації Laravel, включаючи вхід, реєстрацію, скидання пароля, верифікацію електронної пошти та інше.

Ви не зобов'язані використовувати Fortify для використання функцій автентифікації Laravel. Ви завжди можете вручну взаємодіяти з сервісами автентифікації Laravel, дотримуючись документації, доступної в розділах автентифікація, скидання пароля та верифікація електронної пошти.

Якщо ви новачок у Laravel, можливо, ви захочете ознайомитися з нашими стартовими наборами для застосунків перед тим, як спробувати використовувати Laravel Fortify. Наші стартові набори надають каркас аутентифікації для вашого застосунку, який включає інтерфейс користувача, побудований з використанням Tailwind CSS. Це дозволяє вам вивчити та ознайомитися з функціями аутентифікації Laravel перед тим, як дозволити Laravel Fortify реалізувати ці функції для вас.

Laravel Fortify по суті бере маршрути та контролери наших стартових наборів застосунків і пропонує їх як пакет, що не включає інтерфейс користувача. Це дозволяє вам швидко створити бекенд-реалізацію шару автентифікації вашого застосунку без прив'язки до будь-яких конкретних думок щодо фронтенду.

Коли слід використовувати Fortify?

Ви можете запитувати себе, коли доречно використовувати Laravel Fortify. По-перше, якщо ви використовуєте один з стартових комплектів застосунків Laravel, вам не потрібно встановлювати Laravel Fortify, оскільки всі стартові комплекти застосунків Laravel вже надають повну реалізацію автентифікації.

Якщо ви не використовуєте стартовий комплект застосунку і вашому застосунку потрібні функції автентифікації, у вас є два варіанти: вручну реалізувати функції автентифікації вашого застосунку або використовувати Laravel Fortify для забезпечення бекенд-реалізації цих функцій.

Якщо ви вирішите встановити Fortify, ваш користувацький інтерфейс буде надсилати запити до маршрутів автентифікації Fortify, які детально описані в цій документації, для автентифікації та реєстрації користувачів.

Якщо ви вирішите взаємодіяти з сервісами аутентифікації Laravel вручну, замість використання Fortify, ви можете зробити це, дотримуючись документації, доступної в розділах аутентифікація, скидання пароля та верифікація електронної пошти.

Laravel Fortify і Laravel Sanctum

Деякі розробники плутаються щодо різниці між Laravel Sanctum та Laravel Fortify. Оскільки ці два пакети вирішують дві різні, але пов'язані проблеми, Laravel Fortify та Laravel Sanctum не є взаємовиключними або конкуруючими пакетами.

Laravel Sanctum стосується лише управління API токенами та автентифікації існуючих користувачів за допомогою сесійних кукі або токенів. Sanctum не надає жодних маршрутів для обробки реєстрації користувачів, скидання паролів тощо.

Якщо ви намагаєтеся вручну створити шар автентифікації для застосунку, який пропонує API або слугує бекендом для односторінкового застосунку, цілком можливо, що ви будете використовувати як Laravel Fortify (для реєстрації користувачів, скидання паролів тощо), так і Laravel Sanctum (управління API токенами, автентифікація сесій).

Встановлення

Щоб розпочати, встановіть Fortify за допомогою менеджера пакетів компонувальник:

composer require laravel/fortify

Далі опублікуйте ресурси Fortify, використовуючи Artisan команду fortify:install:

php artisan fortify:install

Ця команда опублікує дії Fortify у вашому каталозі app/Actions, який буде створено, якщо він не існує. Крім того, буде опубліковано FortifyServiceProvider, файл конфігурації та всі необхідні міграції бази даних.

Далі, вам слід виконати міграцію вашої бази даних:

php artisan migrate

Функції Fortify

Файл конфігурації fortify містить масив конфігурації features. Цей масив визначає, які бекенд-маршрути / функції Fortify буде надавати за замовчуванням. Ми рекомендуємо вмикати лише наступні функції, які є базовими функціями автентифікації, що надаються більшістю Laravel-застосунків:

'features' => [
    Features::registration(),
    Features::resetPasswords(),
    Features::emailVerification(),
],

Вимкнення Представлень

За замовчуванням Fortify визначає маршрути, які призначені для повернення представлень, таких як екран входу або екран реєстрації. Однак, якщо ви створюєте односторінковий застосунок на основі JavaScript, вам можуть не знадобитися ці маршрути. З цієї причини ви можете повністю вимкнути ці маршрути, встановивши значення конфігурації views у файлі конфігурації вашого застосунку config/fortify.php на false:

'views' => false,

Вимкнення Представлень та Скидання Пароля

Якщо ви вирішите вимкнути представлення Fortify і будете реалізовувати функції скидання пароля для вашого застосунку, вам все одно слід визначити маршрут з назвою password.reset, який відповідає за відображення "скидання пароля" представлення вашого застосунку. Це необхідно, оскільки сповіщення Laravel Illuminate\Auth\Notifications\ResetPassword згенерує URL-адресу для скидання пароля через іменований маршрут password.reset.

Аутентифікація

Щоб почати, нам потрібно вказати Fortify, як повертати наше представлення "login". Пам'ятайте, Fortify - це бібліотека аутентифікації без інтерфейсу. Якщо ви хочете використовувати реалізацію аутентифікаційних функцій Laravel з готовим інтерфейсом, вам слід скористатися стартовим набором застосунку.

Весь рендеринг логіки представлення аутентифікації може бути налаштований за допомогою відповідних методів, доступних через клас Laravel\Fortify\Fortify. Зазвичай, ви повинні викликати цей метод з методу boot класу App\Providers\FortifyServiceProvider вашого застосунку. Fortify подбає про визначення маршруту /login, який повертає це представлення:

use Laravel\Fortify\Fortify;
 
/**
* Ініціалізувати будь-які сервіси застосунку.
*/
public function boot(): void
{
Fortify::loginView(function () {
return view('auth.login');
});
 
// ...
}

Ваш шаблон входу повинен містити форму, яка виконує POST-запит до /login. Кінцева точка /login очікує рядок email / username та password. Ім'я поля email / username повинно відповідати значенню username у файлі конфігурації config/fortify.php. Крім того, може бути надано булеве поле remember, щоб вказати, що користувач бажає використовувати функціональність "запам'ятати мене", яку надає Laravel.

Якщо спроба входу успішна, Fortify перенаправить вас на URI, налаштований через параметр конфігурації home у файлі конфігурації fortify вашого застосунку. Якщо запит на вхід був XHR-запитом, буде повернуто HTTP-відповідь з кодом 200.

Якщо запит не був успішним, користувач буде перенаправлений назад на екран входу, і помилки валідації будуть доступні вам через спільну змінну $errors шаблону Blade. Або, у випадку XHR-запиту, помилки валідації будуть повернуті з HTTP-відповіддю 422.

Налаштування автентифікації користувачів

Fortify автоматично отримуватиме та автентифікуватиме користувача на основі наданих облікових даних та guard автентифікації, який налаштований для вашого застосунку. Однак іноді ви можете захотіти мати повну кастомізацію того, як автентифікуються облікові дані для входу та як отримуються користувачі. На щастя, Fortify дозволяє легко досягти цього за допомогою методу Fortify::authenticateUsing.

Цей метод приймає замикання, яке отримує вхідний HTTP-запит. Замикання відповідає за перевірку облікових даних для входу, прикріплених до запиту, і повернення відповідного екземпляра користувача. Якщо облікові дані недійсні або користувача не знайдено, замикання має повернути null або false. Зазвичай цей метод слід викликати з методу boot вашого FortifyServiceProvider:

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Laravel\Fortify\Fortify;
 
/**
* Ініціалізувати будь-які сервіси застосунку.
*/
public function boot(): void
{
Fortify::authenticateUsing(function (Request $request) {
$user = User::where('email', $request->email)->first();
 
if ($user &&
Hash::check($request->password, $user->password)) {
return $user;
}
});
 
// ...
}

Аутентифікаційний Guard

Ви можете налаштувати guard автентифікації, який використовується Fortify, у файлі конфігурації вашого застосунку fortify. Однак, ви повинні переконатися, що налаштований guard є реалізацією Illuminate\Contracts\Auth\StatefulGuard. Якщо ви намагаєтеся використовувати Laravel Fortify для автентифікації SPA, вам слід використовувати стандартний guard web Laravel у поєднанні з Laravel Sanctum.

Налаштування конвеєра автентифікації

Laravel Fortify аутентифікує запити на вхід через конвеєр викликаних класів. Якщо ви бажаєте, ви можете визначити власний конвеєр класів, через які повинні проходити запити на вхід. Кожен клас повинен мати метод __invoke, який отримує вхідний екземпляр Illuminate\Http\Request і, як middleware, змінну $next, яка викликається для передачі запиту до наступного класу в конвеєрі.

Щоб визначити свій власний конвеєр, ви можете використовувати метод Fortify::authenticateThrough. Цей метод приймає замикання, яке повинно повертати масив класів для обробки запиту на вхід. Зазвичай цей метод слід викликати з методу boot вашого класу App\Providers\FortifyServiceProvider.

Приклад нижче містить визначення конвеєра за замовчуванням, яке ви можете використовувати як відправну точку для внесення власних змін:

use Laravel\Fortify\Actions\AttemptToAuthenticate;
use Laravel\Fortify\Actions\CanonicalizeUsername;
use Laravel\Fortify\Actions\EnsureLoginIsNotThrottled;
use Laravel\Fortify\Actions\PrepareAuthenticatedSession;
use Laravel\Fortify\Actions\RedirectIfTwoFactorAuthenticatable;
use Laravel\Fortify\Features;
use Laravel\Fortify\Fortify;
use Illuminate\Http\Request;
 
Fortify::authenticateThrough(function (Request $request) {
    return array_filter([
            config('fortify.limiters.login') ? null : EnsureLoginIsNotThrottled::class,
            config('fortify.lowercase_usernames') ? CanonicalizeUsername::class : null,
            Features::enabled(Features::twoFactorAuthentication()) ? RedirectIfTwoFactorAuthenticatable::class : null,
            AttemptToAuthenticate::class,
            PrepareAuthenticatedSession::class,
    ]);
});

Обмеження аутентифікації

За замовчуванням, Fortify буде обмежувати спроби автентифікації за допомогою EnsureLoginIsNotThrottled middleware. Це middleware обмежує спроби, які є унікальними для комбінації імені користувача та IP-адреси.

Деякі застосунки можуть вимагати іншого підходу до обмеження спроб автентифікації, наприклад, обмеження лише за IP-адресою. Тому Fortify дозволяє вам вказати власний лімітер швидкості через параметр конфігурації fortify.limiters.login. Звісно, цей параметр конфігурації знаходиться у файлі конфігурації вашого застосунку config/fortify.php.

Використання суміші обмеження швидкості, двохфакторної автентифікації та зовнішнього веб-застосунку firewall (WAF) забезпечить найнадійніший захист для ваших легітимних користувачів застосунку.

Налаштування Перенаправлень

Якщо спроба входу успішна, Fortify перенаправить вас на URI, налаштований через параметр конфігурації home у файлі конфігурації fortify вашого застосунку. Якщо запит на вхід був XHR-запитом, буде повернуто HTTP-відповідь з кодом 200. Після виходу користувача із застосунку, користувач буде перенаправлений на URI /.

Якщо вам потрібна розширена настройка цієї поведінки, ви можете зв'язати реалізації контрактів LoginResponse та LogoutResponse у сервіс-контейнер Laravel. Зазвичай це слід робити в методі register класу App\Providers\FortifyServiceProvider вашого застосунку:

use Laravel\Fortify\Contracts\LogoutResponse;
 
/**
* Ініціалізувати будь-які сервіси застосунку.
*/
public function register(): void
{
$this->app->instance(LogoutResponse::class, new class implements LogoutResponse {
public function toResponse($request)
{
return redirect('/');
}
});
}

Двофакторна аутентифікація

Коли функція двофакторної автентифікації Fortify увімкнена, від користувача вимагається ввести шестизначний числовий токен під час процесу автентифікації. Цей токен генерується за допомогою одноразового пароля на основі часу (TOTP), який можна отримати з будь-якого сумісного з TOTP мобільного застосунку для автентифікації, такого як Google Authenticator.

Перш ніж почати, спочатку переконайтеся, що модель вашого застосунку App\Models\User використовує трейд Laravel\Fortify\TwoFactorAuthenticatable:

<?php
 
namespace App\Models;
 
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Fortify\TwoFactorAuthenticatable;
 
class User extends Authenticatable
{
    use Notifiable, TwoFactorAuthenticatable;
}

Далі, вам слід створити екран у вашому застосунку, де користувачі можуть керувати своїми налаштуваннями двофакторної автентифікації. Цей екран повинен дозволяти користувачу вмикати та вимикати двофакторну автентифікацію, а також відновлювати коди відновлення двофакторної автентифікації.

By default, the features array of the fortify configuration file instructs Fortify's two factor authentication settings to require password confirmation before modification. Therefore, your application should implement Fortify's password confirmation feature before continuing.

Увімкнення двофакторної аутентифікації

Щоб почати увімкнення двофакторної автентифікації, ваш застосунок повинен зробити POST-запит до кінцевої точки /user/two-factor-authentication, визначеної Fortify. Якщо запит успішний, користувач буде перенаправлений назад на попередню URL-адресу, і змінна сесії status буде встановлена на two-factor-authentication-enabled. Ви можете виявити цю змінну сесії status у ваших шаблонах, щоб відобразити відповідне повідомлення про успіх. Якщо запит був XHR-запитом, буде повернуто HTTP-відповідь 200.

Після вибору увімкнення двофакторної аутентифікації, користувач все ще повинен "підтвердити" свою конфігурацію двофакторної аутентифікації, надавши дійсний код двофакторної аутентифікації. Отже, ваше повідомлення про "успіх" повинно інструктувати користувача, що підтвердження двофакторної аутентифікації все ще потрібне:

@if (session('status') == 'two-factor-authentication-enabled')
    <div class="mb-4 font-medium text-sm">
        Please finish configuring two factor authentication below.
    </div>
@endif

Далі, ви повинні відобразити QR-код двофакторної автентифікації, щоб користувач міг відсканувати його у свій застосунок-аутентифікатор. Якщо ви використовуєте Blade для рендерингу фронтенду вашого застосунку, ви можете отримати SVG QR-коду за допомогою методу twoFactorQrCodeSvg, доступного на екземплярі користувача:

$request->user()->twoFactorQrCodeSvg();

Якщо ви створюєте фронтенд на JavaScript, ви можете зробити XHR GET запит до кінцевої точки /user/two-factor-qr-code, щоб отримати QR-код двофакторної автентифікації користувача. Ця кінцева точка поверне JSON-об'єкт, що містить ключ svg.

Підтвердження двофакторної автентифікації

Крім відображення QR-коду двофакторної автентифікації користувача, ви повинні надати текстове поле, де користувач може ввести дійсний код автентифікації для "підтвердження" своєї конфігурації двофакторної автентифікації. Цей код повинен бути наданий до застосунку Laravel через POST-запит до /user/confirmed-two-factor-authentication кінцевої точки, визначеної Fortify.

Якщо запит буде успішним, користувач буде перенаправлений назад на попередню URL-адресу, і змінна сесії status буде встановлена на two-factor-authentication-confirmed:

@if (session('status') == 'two-factor-authentication-confirmed')
    <div class="mb-4 font-medium text-sm">
        Two factor authentication confirmed and enabled successfully.
    </div>
@endif

Якщо запит до кінцевої точки підтвердження двофакторної автентифікації був зроблений через XHR-запит, буде повернуто HTTP-відповідь 200.

Відображення кодів відновлення

Ви також повинні відобразити коди відновлення двофакторної аутентифікації користувача. Ці коди відновлення дозволяють користувачу аутентифікуватися, якщо вони втратять доступ до свого мобільного пристрою. Якщо ви використовуєте Blade для рендерингу фронтенду вашого застосунку, ви можете отримати доступ до кодів відновлення через екземпляр аутентифікованого користувача:

(array) $request->user()->recoveryCodes()

Якщо ви створюєте фронтенд на JavaScript, ви можете зробити XHR GET запит до /user/two-factor-recovery-codes кінцевої точки. Ця кінцева точка поверне JSON масив, що містить коди відновлення користувача.

Щоб згенерувати нові коди відновлення для користувача, ваш застосунок повинен зробити POST-запит до кінцевої точки /user/two-factor-recovery-codes.

Аутентифікація з двофакторною аутентифікацією

Під час процесу автентифікації Fortify автоматично перенаправить користувача на екран виклику двофакторної автентифікації вашого застосунку. Однак, якщо ваш застосунок виконує XHR-запит на вхід, JSON-відповідь, що повертається після успішної спроби автентифікації, міститиме JSON-об'єкт, який має булеву властивість two_factor. Ви повинні перевірити це значення, щоб знати, чи слід перенаправляти на екран виклику двофакторної автентифікації вашого застосунку.

Щоб почати реалізацію функціональності двофакторної автентифікації, нам потрібно вказати Fortify, як повертати наше представлення виклику двофакторної автентифікації. Вся логіка рендерингу представлень автентифікації Fortify може бути налаштована за допомогою відповідних методів, доступних через клас Laravel\Fortify\Fortify. Зазвичай, ви повинні викликати цей метод з методу boot класу App\Providers\FortifyServiceProvider вашого застосунку:

use Laravel\Fortify\Fortify;
 
/**
* Ініціалізувати будь-які сервіси застосунку.
*/
public function boot(): void
{
Fortify::twoFactorChallengeView(function () {
return view('auth.two-factor-challenge');
});
 
// ...
}

Fortify подбає про визначення маршруту /two-factor-challenge, який повертає це представлення. Ваш шаблон two-factor-challenge повинен включати форму, яка робить POST-запит до кінцевої точки /two-factor-challenge. Дія /two-factor-challenge очікує поле code, яке містить дійсний TOTP токен, або поле recovery_code, яке містить один з кодів відновлення користувача.

Якщо спроба входу успішна, Fortify перенаправить користувача на URI, налаштований через параметр конфігурації home у файлі конфігурації fortify вашого застосунку. Якщо запит на вхід був XHR-запитом, буде повернуто HTTP-відповідь 204.

Якщо запит не був успішним, користувач буде перенаправлений назад на екран двофакторного виклику, і помилки валідації будуть доступні вам через спільну змінну $errors шаблону Blade. Або, у випадку XHR-запиту, помилки валідації будуть повернуті з відповіддю HTTP 422.

Вимкнення двофакторної автентифікації

Щоб вимкнути двофакторну аутентифікацію, ваш застосунок повинен зробити DELETE-запит до кінцевої точки /user/two-factor-authentication. Пам'ятайте, що кінцеві точки двофакторної аутентифікації Fortify вимагають підтвердження пароля перед викликом.

Реєстрація

Щоб почати реалізацію функціональності реєстрації нашого застосунку, нам потрібно вказати Fortify, як повертати наше представлення "register". Пам'ятайте, Fortify - це бібліотека аутентифікації без інтерфейсу. Якщо ви хочете використовувати реалізацію аутентифікаційних функцій Laravel з готовим інтерфейсом, вам слід скористатися стартовим набором застосунку.

Весь логіка рендерингу представлень Fortify може бути налаштована за допомогою відповідних методів, доступних через клас Laravel\Fortify\Fortify. Зазвичай, ви повинні викликати цей метод з методу boot вашого класу App\Providers\FortifyServiceProvider:

use Laravel\Fortify\Fortify;
 
/**
* Ініціалізувати будь-які сервіси застосунку.
*/
public function boot(): void
{
Fortify::registerView(function () {
return view('auth.register');
});
 
// ...
}

Fortify подбає про визначення маршруту /register, який повертає це представлення. Ваш шаблон register повинен включати форму, яка робить POST-запит до кінцевої точки /register, визначеної Fortify.

Точка входу /register очікує рядок name, рядок електронної адреси / імені користувача, поля password та password_confirmation. Назва поля електронної адреси / імені користувача повинна відповідати значенню конфігурації username, визначеному у файлі конфігурації fortify вашого застосунку.

Якщо спроба реєстрації успішна, Fortify перенаправить користувача на URI, налаштований через параметр конфігурації home у файлі конфігурації fortify вашого застосунку. Якщо запит був XHR-запитом, буде повернуто відповідь HTTP 201.

Якщо запит не був успішним, користувач буде перенаправлений назад на екран реєстрації, і помилки валідації будуть доступні вам через спільну змінну $errors шаблону Blade. Або, у випадку XHR-запиту, помилки валідації будуть повернуті з відповіддю HTTP 422.

Налаштування реєстрації

Процес перевірки та створення користувача може бути налаштований шляхом зміни дії App\Actions\Fortify\CreateNewUser, яка була згенерована під час встановлення Laravel Fortify.

Скидання пароля

Щоб почати реалізацію функціональності скидання пароля нашого застосунку, нам потрібно вказати Fortify, як повертати наше представлення "забули пароль". Пам'ятайте, Fortify — це бібліотека аутентифікації без інтерфейсу. Якщо ви хочете використовувати готову реалізацію функцій аутентифікації Laravel з інтерфейсом, вам слід скористатися стартовим набором застосунку.

Вся логіка рендерингу представлень Fortify може бути налаштована за допомогою відповідних методів, доступних через клас Laravel\Fortify\Fortify. Зазвичай, ви повинні викликати цей метод з методу boot класу App\Providers\FortifyServiceProvider вашого застосунку:

use Laravel\Fortify\Fortify;
 
/**
* Ініціалізувати будь-які сервіси застосунку.
*/
public function boot(): void
{
Fortify::requestPasswordResetLinkView(function () {
return view('auth.forgot-password');
});
 
// ...
}

Fortify подбає про визначення кінцевої точки /forgot-password, яка повертає це представлення. Ваш шаблон forgot-password повинен включати форму, яка робить POST-запит до кінцевої точки /forgot-password.

The /forgot-password кінцева точка очікує рядкове поле email. Назва цього поля / стовпця бази даних повинна відповідати значенню конфігурації email у файлі конфігурації fortify вашого застосунку.

Якщо запит на скидання пароля був успішним, Fortify перенаправить користувача назад на /forgot-password і надішле електронний лист з безпечним посиланням, яке користувач може використати для скидання пароля. Якщо запит був XHR-запитом, буде повернуто відповідь HTTP 200.

Після перенаправлення назад до кінцевої точки /forgot-password після успішного запиту, змінна сесії status може бути використана для відображення статусу спроби запиту посилання на скидання пароля.

Значення змінної сесії $status буде відповідати одному з рядків перекладу, визначених у passwords мовному файлі вашого застосунку. Якщо ви хочете налаштувати це значення і ще не опублікували мовні файли Laravel, ви можете зробити це за допомогою команди Artisan lang:publish:

@if (session('status'))
    <div class="mb-4 font-medium text-sm text-green-600">
        {{ session('status') }}
    </div>
@endif

Якщо запит не був успішним, користувач буде перенаправлений назад на екран запиту посилання для скидання пароля, і помилки валідації будуть доступні вам через спільну змінну $errors шаблону Blade. Або, у випадку XHR-запиту, помилки валідації будуть повернуті з відповіддю HTTP 422.

Скидання пароля

Щоб завершити реалізацію функціональності скидання пароля нашого застосунку, нам потрібно вказати Fortify, як повернути наше представлення "скидання пароля".

Вся логіка рендерингу представлень Fortify може бути налаштована за допомогою відповідних методів, доступних через клас Laravel\Fortify\Fortify. Зазвичай, ви повинні викликати цей метод з методу boot класу App\Providers\FortifyServiceProvider вашого застосунку:

use Laravel\Fortify\Fortify;
use Illuminate\Http\Request;
 
/**
* Ініціалізувати будь-які сервіси застосунку.
*/
public function boot(): void
{
Fortify::resetPasswordView(function (Request $request) {
return view('auth.reset-password', ['request' => $request]);
});
 
// ...
}

Fortify подбає про визначення маршруту для відображення цього представлення. Ваш шаблон reset-password повинен включати форму, яка робить POST-запит до /reset-password.

The /reset-password кінцева точка очікує рядкове поле email, поле password, поле password_confirmation та приховане поле з назвою token, яке містить значення request()->route('token'). Назва поля "email" / стовпця бази даних повинна відповідати значенню конфігурації email, визначеному у файлі конфігурації fortify вашого застосунку.

Обробка відповіді на скидання пароля

Якщо запит на скидання пароля був успішним, Fortify перенаправить назад на маршрут /login, щоб користувач міг увійти з новим паролем. Крім того, буде встановлено змінну сесії status, щоб ви могли відобразити успішний статус скидання на екрані входу:

@if (session('status'))
    <div class="mb-4 font-medium text-sm text-green-600">
        {{ session('status') }}
    </div>
@endif

Якщо запит був XHR-запитом, буде повернуто HTTP-відповідь з кодом 200.

Якщо запит не був успішним, користувач буде перенаправлений назад на екран скидання пароля, і помилки валідації будуть доступні вам через спільну змінну $errors шаблону Blade. Або, у випадку XHR-запиту, помилки валідації будуть повернуті з відповіддю HTTP 422.

Налаштування скидання пароля

Процес скидання пароля можна налаштувати, змінивши дію App\Actions\ResetUserPassword, яка була згенерована, коли ви встановили Laravel Fortify.

Перевірка електронної пошти

Після реєстрації ви можете побажати, щоб користувачі підтвердили свою електронну адресу, перш ніж продовжити доступ до вашого застосунку. Щоб почати, переконайтеся, що функція emailVerification увімкнена в масиві features файлу конфігурації fortify. Далі, ви повинні переконатися, що ваш клас App\Models\User реалізує інтерфейс Illuminate\Contracts\Auth\MustVerifyEmail.

Після завершення цих двох кроків налаштування, нові зареєстровані користувачі отримають електронний лист із запитом на підтвердження володіння їхньою електронною адресою. Однак, нам потрібно повідомити Fortify, як відобразити екран перевірки електронної пошти, який інформує користувача про необхідність натиснути на посилання для підтвердження в електронному листі.

Вся логіка рендерингу представлень Fortify може бути налаштована за допомогою відповідних методів, доступних через клас Laravel\Fortify\Fortify. Зазвичай, ви повинні викликати цей метод з методу boot класу App\Providers\FortifyServiceProvider вашого застосунку:

use Laravel\Fortify\Fortify;
 
/**
* Ініціалізувати будь-які сервіси застосунку.
*/
public function boot(): void
{
Fortify::verifyEmailView(function () {
return view('auth.verify-email');
});
 
// ...
}

Fortify подбає про визначення маршруту, який відображає це представлення, коли користувач перенаправляється на кінцеву точку /email/verify вбудованим у Laravel verified middleware.

Ваш шаблон verify-email повинен містити інформаційне повідомлення з інструкцією для користувача натиснути на посилання для підтвердження електронної пошти, яке було надіслано на їхню електронну адресу.

Якщо ви бажаєте, ви можете додати кнопку до шаблону verify-email вашого застосунку, яка ініціює POST-запит до кінцевої точки /email/verification-notification. Коли ця кінцева точка отримує запит, нове посилання для верифікації буде надіслано користувачу, що дозволяє отримати нове посилання для верифікації, якщо попереднє було випадково видалено або втрачено.

Якщо запит на повторне відправлення електронного листа з посиланням для верифікації був успішним, Fortify перенаправить користувача назад до кінцевої точки /email/verify з сесійною змінною status, що дозволяє вам відобразити інформаційне повідомлення користувачу, інформуючи його про успішність операції. Якщо запит був XHR-запитом, буде повернуто HTTP-відповідь 202:

@if (session('status') == 'verification-link-sent')
    <div class="mb-4 font-medium text-sm text-green-600">
        A new email verification link has been emailed to you!
    </div>
@endif

Захист маршрутів

Щоб вказати, що маршрут або група маршрутів вимагає, щоб користувач підтвердив свою електронну адресу, ви повинні прикріпити вбудоване Laravel verified middleware до маршруту. Псевдонім verified middleware автоматично реєструється Laravel і служить псевдонімом для Illuminate\Auth\Middleware\EnsureEmailIsVerified middleware:

Route::get('/dashboard', function () {
    // ...
})->middleware(['verified']);

Підтвердження пароля

Під час створення вашого застосунку, іноді можуть виникати дії, які вимагають від користувача підтвердити свій пароль перед виконанням дії. Зазвичай ці маршрути захищені вбудованим middleware Laravel password.confirm.

Щоб почати реалізацію функціональності підтвердження пароля, нам потрібно вказати Fortify, як повертати "представлення підтвердження пароля" нашого застосунку. Пам'ятайте, Fortify є безголовою бібліотекою автентифікації. Якщо ви хочете використовувати готову фронтенд-реалізацію функцій автентифікації Laravel, вам слід скористатися стартовим набором застосунку.

Вся логіка рендерингу представлень Fortify може бути налаштована за допомогою відповідних методів, доступних через клас Laravel\Fortify\Fortify. Зазвичай, ви повинні викликати цей метод з методу boot класу App\Providers\FortifyServiceProvider вашого застосунку:

use Laravel\Fortify\Fortify;
 
/**
* Ініціалізувати будь-які сервіси застосунку.
*/
public function boot(): void
{
Fortify::confirmPasswordView(function () {
return view('auth.confirm-password');
});
 
// ...
}

Fortify подбає про визначення кінцевої точки /user/confirm-password, яка повертає це представлення. Ваш шаблон confirm-password повинен включати форму, яка робить POST-запит до кінцевої точки /user/confirm-password. Кінцева точка /user/confirm-password очікує поле password, яке містить поточний пароль користувача.

Якщо пароль збігається з поточним паролем користувача, Fortify перенаправить користувача на маршрут, до якого він намагався отримати доступ. Якщо запит був XHR-запитом, буде повернуто відповідь HTTP 201.

Якщо запит не був успішним, користувач буде перенаправлений назад на екран підтвердження пароля, і помилки валідації будуть доступні вам через спільну змінну шаблону Blade $errors. Або, у випадку XHR-запиту, помилки валідації будуть повернені з HTTP-відповіддю 422.