1. Пакеты
  2. Laravel Fortify

Присоединяйся к нашему Telegram сообществу @webblend!

Здесь ты найдешь сниппеты по Laravel и полезные советы по веб-разработке.

Введение

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

Поскольку Fortify не предоставляет собственного пользовательского интерфейса, он предназначен для использования вместе с вашим собственным пользовательским интерфейсом, который делает запросы к зарегистрированным маршрутам. Мы расскажем о том, как делать запросы к этим маршрутам в оставшейся части документации.

Примечание Помните, что Fortify - это пакет, который предназначен дать вам старт для реализации функций аутентификации Laravel. Вы не обязаны использовать его. Вы всегда свободны вручную взаимодействовать с сервисами аутентификации Laravel, следуя документации, доступной в разделах аутентификации, сброса пароля и проверки электронной почты.

Что такое Fortify?

Как упоминалось ранее, Laravel Fortify - это реализация бэкенда аутентификации для Laravel, независимая от фронтенда. Fortify регистрирует маршруты и контроллеры, необходимые для реализации всех функций аутентификации Laravel, включая вход, регистрацию, сброс пароля, проверку по электронной почте и многое другое.

Вы не обязаны использовать Fortify для использования функций аутентификации Laravel. Вы всегда можете вручную взаимодействовать с сервисами аутентификации Laravel, следуя документации, доступной в authentication, password reset и email verification.

Если вы новичок в Laravel, вы можете ознакомиться с Laravel Breeze - стартовым набором приложения, прежде чем пытаться использовать Laravel Fortify. Laravel Breeze предоставляет настройки аутентификации для вашего приложения, включая пользовательский интерфейс, созданный с использованием Tailwind CSS. В отличие от Fortify, Breeze публикует свои маршруты и контроллеры непосредственно в ваше приложение. Это позволяет вам изучить и привыкнуть к функциям аутентификации Laravel, прежде чем разрешить Laravel Fortify реализовать их для вас.

По сути, Laravel Fortify берет маршруты и контроллеры Laravel Breeze и предлагает их в виде пакета, не включающего пользовательский интерфейс. Это позволяет вам быстро настроить бэкенд вашего приложения без привязки к конкретным мнениям фронтенда.

Когда следует использовать Fortify?

Возможно, вы задаетесь вопросом, когда стоит использовать Laravel Fortify. Во-первых, если вы используете один из комплектов стартеров приложений Laravel, вам не нужно устанавливать Laravel Fortify, так как все комплекты стартеров приложений Laravel уже предоставляют полную реализацию аутентификации.

Если вы не используете стартовый набор приложения и вашему приложению требуются функции аутентификации, у вас есть два варианта: вручную реализовать функции аутентификации вашего приложения или использовать Laravel Fortify для предоставления бэкенд-реализации этих функций.

Если вы решите установить Fortify, ваш интерфейс пользователя будет отправлять запросы к маршрутам аутентификации Fortify, подробно описанным в данной документации, чтобы аутентифицировать и регистрировать пользователей.

Если вы выберете установку Fortify, ваш интерфейс пользователя будет отправлять запросы к маршрутам аутентификации Fortify, которые подробно описаны в данной документации, чтобы аутентифицировать и регистрировать пользователей.

Laravel Fortify & Laravel Sanctum

Некоторые разработчики путаются относительно разницы между Laravel Sanctum и Laravel Fortify. Поскольку эти два пакета решают две разные, но связанные проблемы, Laravel Fortify и Laravel Sanctum не являются взаимоисключающими или конкурирующими пакетами.

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

Если вы пытаетесь вручную создать слой аутентификации для приложения, предоставляющего API или служащего бэкендом для одностраничного приложения, совершенно возможно, что вы будете использовать как Laravel Fortify (для регистрации пользователей, сброса пароля и т.д.), так и Laravel Sanctum (управление токенами API, аутентификация сеанса).

Установка

Для начала установите Fortify, используя менеджер пакетов Composer:

composer require laravel/fortify

Затем опубликуйте ресурсы Fortify с помощью команды vendor:publish:

php artisan vendor:publish --provider="Laravel\Fortify\FortifyServiceProvider"

Эта команда опубликует действия Fortify в каталог app/Actions, который будет создан, если его нет. Кроме того, будут опубликованы служба-поставщик FortifyServiceProvider, файл конфигурации и все необходимые миграции базы данных.

Затем выполните миграцию базы данных:

php artisan migrate

Провайдер службы Fortify

Команда vendor:publish, обсуждаемая выше, также опубликует класс App\Providers\FortifyServiceProvider. Убедитесь, что этот класс зарегистрирован в массиве providers файла конфигурации вашего приложения config/app.php.

Сервис-поставщик Fortify регистрирует действия, которые Fortify опубликовал, и указывает Fortify использовать их при выполнении соответствующих задач.

Возможности Fortify

Конфигурационный файл fortify содержит массив конфигурации features. Этот массив определяет, какие маршруты / функции Fortify будет предоставлять по умолчанию. Если вы не используете Fortify в сочетании с Laravel Jetstream, мы рекомендуем вам включить только следующие функции, которые предоставляют основные функции аутентификации, предоставляемые большинством приложений Laravel:

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

Отключение представлений

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

'views' => false,

Отключение представлений и сброса пароля

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

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

Для начала нам нужно научить Fortify возвращать наше представление "вход". Помните, что 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. Имя поля электронной почты / имени пользователя должно совпадать со значением username в файле конфигурации config/fortify.php. Кроме того, может быть предоставлено булево поле remember, чтобы указать, что пользователь хочет использовать функциональность "запомнить меня", предоставляемую Laravel.

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

Если запрос был неудачным, пользователь будет перенаправлен обратно на экран входа, и ошибки проверки будут доступны вам через общую переменную шаблона Blade $errors см.. Или, в случае запроса XHR, ошибки проверки будут возвращены с HTTP-ответом 422.

Настройка аутентификации пользователя

Fortify автоматически извлекает и аутентифицирует пользователя на основе предоставленных учетных данных и охраны аутентификации, настроенной для вашего приложения. Однако иногда вам может потребоваться полное управление тем, как проверяются учетные данные для входа, и как извлекаются пользователи. К счастью, 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;
}
});
 
// ...
}

Охранник аутентификации

Вы можете настроить охрану аутентификации, используемую Fortify, в конфигурационном файле вашего приложения fortify. Однако убедитесь, что настроенная охрана является реализацией Illuminate\Contracts\Auth\StatefulGuard. Если вы пытаетесь использовать Laravel Fortify для аутентификации SPA, вы должны использовать стандартную охрану Laravel web в сочетании с Laravel Sanctum.

Настройка конвейера аутентификации

Laravel Fortify аутентифицирует запросы на вход через конвейер вызываемых классов. При необходимости вы можете определить собственный конвейер классов, через который должны проходить запросы на вход. Каждый класс должен иметь метод __invoke, который принимает входящий экземпляр Illuminate\Http\Request и, как посредник, переменную $next, которая вызывается для передачи запроса следующему классу в конвейере.

Чтобы определить свой собственный конвейер, вы можете использовать метод Fortify::authenticateThrough. Этот метод принимает замыкание, которое должно возвращать массив классов, через которые должен проходить запрос на вход. Обычно этот метод следует вызывать из метода boot вашего класса App\Providers\FortifyServiceProvider.

Приведенный ниже пример содержит определение конвейера по умолчанию, которое вы можете использовать в качестве отправной точки при внесении своих изменений:

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

Настройка перенаправлений

Если попытка входа выполнена успешно, 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), который можно получить из любого приложения аутентификации мобильных устройств, такого как 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;
}

Next, you should build a screen within your application where users can manage their two factor authentication settings. This screen should allow the user to enable and disable two factor authentication, as well as regenerate their two factor authentication recovery codes.

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.

Enabling Two Factor Authentication

To begin enabling two factor authentication, your application should make a POST request to the /user/two-factor-authentication endpoint defined by Fortify. If the request is successful, the user will be redirected back to the previous URL and the status session variable will be set to two-factor-authentication-enabled. You may detect this status session variable within your templates to display the appropriate success message. If the request was an XHR request, 200 HTTP response will be returned.

After choosing to enable two factor authentication, the user must still "confirm" their two factor authentication configuration by providing a valid two factor authentication code. So, your "success" message should instruct the user that two factor authentication confirmation is still required:

@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 для отображения пользовательского интерфейса вашего приложения, вы можете получить QR-код SVG с использованием метода 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.

Если запрос не выполнен успешно, пользователь будет перенаправлен обратно на экран вызова двухфакторной аутентификации, и ошибки валидации будут доступны через общую переменную Blade $errors переменная шаблона. Или, в случае 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.

Если запрос не выполнен успешно, пользователь будет перенаправлен обратно на экран регистрации, и ошибки валидации будут доступны через общую переменную Blade $errors переменная шаблона. Или, в случае XHR-запроса, ошибки валидации будут возвращены с HTTP-ответом 422.

Настройка регистрации

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

Сброс пароля

Запрос ссылки на сброс пароля

Для начала реализации функциональности сброса пароля в нашем приложении нам нужно указать Fortify, как возвращать наш вид "forgot password". Помните, что 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.

Конечная точка /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

Если запрос не выполнен успешно, пользователь будет перенаправлен обратно на экран запроса ссылки для сброса пароля, и ошибки валидации будут доступны через общую переменную Blade $errors переменная шаблона. Или, в случае XHR-запроса, ошибки валидации будут возвращены с HTTP-ответом 422.

Сброс пароля

Для завершения реализации функциональности сброса пароля нашего приложения нам нужно указать Fortify, как возвращать наш вид "reset password".

Вся логика отображения представлений 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.

Конечная точка /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.

Если запрос не выполнен успешно, пользователь будет перенаправлен обратно на экран сброса пароля, и ошибки валидации будут доступны через общую переменную Blade $errors переменная шаблона. Или, в случае 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 middleware verified.

Ваш шаблон 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 зарегистрирован в классе App\Http\Kernel вашего приложения:

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

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

При создании вашего приложения у вас может возникнуть необходимость в действиях, которые требуют от пользователя подтверждения пароля перед выполнением действия. Обычно эти маршруты защищены встроенным в Laravel middleware 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 позаботится о определении маршрута для отображения этого вида. Ваш шаблон confirm-password должен включать форму, которая делает POST-запрос к конечной точке /user/confirm-password. Конечная точка /user/confirm-password ожидает поле password, содержащее текущий пароль пользователя.

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

Если запрос не выполнен успешно, пользователь будет перенаправлен обратно на экран подтверждения пароля, и ошибки валидации будут доступны через общую переменную Blade $errors. Или, в случае XHR-запроса, ошибки валидации будут возвращены с HTTP-ответом 422.