Пакет Laravel Fortify
- Введение
- Что такое Fortify?
- Когда я должен использовать Fortify?
- Установка
- Функционал Fortify
- Отключение маршрутов, возвращающих шаблоны
- Аутентификация
- Настройка аутентификации пользователя
- Настройка конвейера аутентификации
- Настройка переадресации
- Двухфакторная аутентификация
- Включение двухфакторной аутентификации
- Использование двухфакторной аутентификации
- Отключение двухфакторной аутентификации
- Регистрация
- Настройка регистрации
- Сброс пароля
- Запрос ссылки для сброса пароля
- Отображение страницы сброса пароля
- Настройка сброса пароля
- Подтверждение адреса электронной почты
- Защита маршрутов
- Подтверждение пароля
Введение
Laravel Fortify – это независимая от внешнего интерфейса серверная реализация аутентификации для Laravel. Fortify регистрирует маршруты и контроллеры, необходимые для реализации всего функционала аутентификации Laravel, включая вход в систему, регистрацию, сброс пароля, подтверждение электронной почты и многое другое. После установки Fortify вы можете запустить команду route:list
Artisan, чтобы просмотреть маршруты, зарегистрированные Fortify.
Поскольку Fortify не обеспечен собственным пользовательским интерфейсом, он предназначен для работы в паре с вашим собственным пользовательским интерфейсом, который отправляет запросы на регистрируемые им маршруты. Мы обсудим, как именно делать запросы к этим маршрутам, в оставшейся части этой документации.
Помните, что Fortify – это пакет, который поможет вам начать реализацию функционала аутентификации Laravel. Вы не обязаны его использовать. Вы всегда можете вручную взаимодействовать со службами аутентификации Laravel, следуя документации: аутентификация, сброс пароля, и подтверждение по электронной почте.
Что такое Fortify?
Как упоминалось ранее, Laravel Fortify – это независимая от внешнего интерфейса серверная реализация аутентификации для Laravel. Fortify регистрирует маршруты и контроллеры, необходимые для реализации всего функционала аутентификации Laravel, включая вход в систему, регистрацию, сброс пароля, подтверждение электронной почты и многое другое.
Вам необязательно использовать Fortify, чтобы использовать функционал аутентификации Laravel. Вы всегда можете вручную взаимодействовать со службами аутентификации Laravel, следуя документации: аутентификация, сброс пароля, и подтверждение по электронной почте.
Если вы новичок в 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, которые подробно описаны в этой документации, для аутентификации и регистрации пользователей.
Если вы решите самостоятельно взаимодействовать со службами аутентификации Laravel вместо использования Fortify, вы можете сделать это, следуя документации: аутентификация, сброс пароля, и подтверждение по электронной почте.
Laravel Fortify и Laravel Sanctum
Некоторых разработчиков смущает разница между Laravel Sanctum и Laravel Fortify. Поскольку эти два пакета решают две разные, но связанные проблемы, Laravel Fortify и Laravel Sanctum не являются взаимоисключающими или конкурирующими пакетами.
Laravel Sanctum занимается только управлением токенами API и аутентификацией существующих пользователей с помощью файлов Cookies сессии или токенов. Sanctum не содержит никаких маршрутов для регистрации пользователей, сброса пароля и т. д.
Если вы пытаетесь самостоятельно создать слой аутентификации для приложения, которое предлагает API или служит серверной частью для одностраничного приложения, вполне возможно, что вы будете использовать оба пакета: Laravel Fortify (для регистрации пользователя, сброса пароля и т. д.) и Laravel Sanctum (управление токенами API, аутентификация сессии).
Установка
Для начала установите Fortify с помощью менеджера пакетов Composer в свой проект:
composer require laravel/fortify
Затем, опубликуйте ресурсы Fortify с помощью Artisan-команды fortify:install
:
php artisan fortify:install
Эта команда опубликует действия Fortify в вашем каталоге app/Actions
, который будет создан, если он не существует. Кроме того, будут опубликованы FortifyServiceProvider
, файл конфигурации и все необходимые миграции базы данных.
Затем, вы должны применить миграции вашей базу данных:
php artisan migrate
Функционал 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
, который отвечает за отображение шаблона «сброса пароля» вашего приложения. Это необходимо, потому что уведомление Laravel Illuminate\Auth\Notifications\ResetPassword
генерирует 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
. Имя поля email
/ username
должно соответствовать значению username
в конфигурационном файле config/fortify.php
. Кроме того, может быть предусмотрено логическое поле «Запомнить меня», чтобы указать, что пользователь хотел бы использовать функционал «Запомнить меня», предоставляемый Laravel.
Если попытка входа в систему будет успешной, то Fortify перенаправит вас на URI, настроенный с помощью параметра конфигурации home
в файле конфигурации fortify
вашего приложения. Если запрос на вход был запросом XHR (аякс-запросом), будет возвращен 200
HTTP-ответ.
Если запрос не был успешным, пользователь будет перенаправлен обратно к экрану входа в систему, и ошибки валидации будут доступны вам через общедоступную переменную $errors
шаблонов Blade. Или, в случае запроса XHR, ошибки валидации будут возвращены с 422
HTTP-ответом.
Настройка аутентификации пользователя
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, то вам следует использовать стандартного охранника web
Laravel в сочетании с Laravel Sanctum.
Настройка конвейера аутентификации
Laravel Fortify аутентифицирует запросы на вход через конвейер вызываемых классов. При желании вы можете определить настраиваемый конвейер классов, через который должны передаваться запросы на вход. Каждый класс должен иметь метод __invoke
, который получает экземпляр Illuminate\Http\Request
и, как посредники, переменную $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
. Этот посредник ограничивает попытки, уникальные для комбинации имени пользователя и IP-адреса.
Некоторым приложениям может потребоваться другой подход к регулированию попыток аутентификации, например регулирование только по IP-адресу. Таким образом, Fortify позволяет вам указать свой собственный ограничитель скорости с помощью параметра конфигурации fortify.limiters.login
. Конечно, этот параметр конфигурации находится в файле конфигурации вашего приложения config/fortify.php
.
Использование сочетания регулирования, двухфакторной аутентификации и внешнего брандмауэра веб-приложений (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;
}
Затем, вы должны создать экран в своем приложении, где пользователи могут управлять своими настройками двухфакторной аутентификации. Этот экран должен позволить пользователю включать и отключать двухфакторную аутентификацию, а также повторно создавать коды восстановления двухфакторной аутентификации.
По умолчанию массив
features
конфигурационного файлаconfig/fortify.php
указывает настройкам двухфакторной аутентификации Fortify требовать подтверждения пароля перед изменением. Поэтому, прежде чем продолжить, ваше приложение должно реализовать функционал подтверждение пароля Fortify.
Включение двухфакторной аутентификации
Чтобы начать включение двухфакторной аутентификации, ваше приложение должно сделать POST-запрос к URL /user/two-factor-authentication
, определенному Fortify. Если запрос будет успешным, то пользователь будет перенаправлен обратно на предыдущий URL-адрес, а для переменной status
сессии будет установлено значение two-factor-authentication-enabled
. Вы можете использовать эту переменную status
сессии в своих шаблонах, чтобы отобразить соответствующее сообщение об успешном выполнении. Если запрос был запросом XHR (аякс-запросом), будет возвращен 200
HTTP-ответ:
После выбора включения двухфакторной аутентификации пользователю все равно нужно “подтвердить” свою конфигурацию двухфакторной аутентификации, предоставив действительный код двухфакторной аутентификации. Поэтому ваше сообщение “успеха” должно информировать пользователя о том, что требуется подтверждение двухфакторной аутентификации:
@if (session('status') == 'two-factor-authentication-enabled')
<div class="mb-4 font-medium text-sm">
Завершите настройку двухфакторной аутентификации ниже.
</div>
@endif
Затем, вы должны отобразить QR-код двухфакторной аутентификации, чтобы пользователь мог сканировать его своим приложением для аутентификации. Если вы используете Blade для отрисовки интерфейса вашего приложения, то вы можете получить SVG с QR-кодом, используя метод twoFactorQrCodeSvg
экземпляра пользователя:
$request->user()->twoFactorQrCodeSvg();
Если вы создаете интерфейс на основе JavaScript, то вы можете сделать XHR GET-запрос (аякс-запрос) к URL /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">
Двухфакторная аутентификация подтверждена и успешно включена.
</div>
@endif
Если запрос к конечной точке подтверждения двухфакторной аутентификации был выполнен через XHR (XMLHttpRequest), будет возвращен HTTP-ответ с кодом 200
.
Отображение кодов восстановления
Вы также должны отобразить коды двухфакторного восстановления пользователя. Эти коды восстановления позволяют пользователю пройти аутентификацию, если он потеряет доступ к своему мобильному устройству. Если вы используете Blade для отрисовки внешнего интерфейса вашего приложения, то вы можете получить доступ к кодам восстановления через экземпляр аутентифицированного пользователя:
(array) $request->user()->recoveryCodes()
Если вы создаете интерфейс на основе JavaScript, то вы можете сделать XHR GET-запрос (аякс-запрос) к URL /user/two-factor-recovery-codes
. Этот эндпоинт вернет массив JSON, содержащий коды восстановления пользователя.
Чтобы повторно сгенерировать коды восстановления пользователя, ваше приложение должно сделать POST-запрос к URL /user/two-factor-recovery-codes
.
Использование двухфакторной аутентификации
В процессе аутентификации Fortify автоматически перенаправляет пользователя на экран запроса двухфакторной аутентификации приложения. Однако, если ваше приложение выполняет запрос XHR (аякс-запрос) для входа в систему, то ответ JSON, возвращаемый после успешной попытки аутентификации, будет содержать объект JSON, содержащий логическое свойство two_factor
. Необходимо проверить это значение, чтобы узнать, следует ли перенаправлять на экран запроса двухфакторной аутентификации приложения.
Чтобы начать реализацию функционала двухфакторной аутентификации, нам нужно указать Fortify, как вернуть наш шаблон two-factor-challenge
. Вся логика визуализации шаблона two-factor-challenge
Fortify может быть определена с помощью метода twoFactorChallengeView
класса 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-запрос к URL /two-factor-challenge
. Действие /two-factor-challenge
ожидает поле code
, которое содержит действительный TOTP-токен, или поле recovery_code
, которое содержит один из кодов восстановления пользователя.
Если попытка входа окажется успешной, то Fortify перенаправит пользователя на URI, указанный в параметре конфигурации home
файле конфигурации fortify
вашего приложения. Если запрос на вход был запросом XHR, будет возвращен 204
HTTP-ответ.
Если запрос не был успешным, пользователь будет перенаправлен обратно к экрану двухфакторной проверки, и ошибки валидации будут доступны вам через общедоступную переменную $errors
шаблонов Blade. Или, в случае запроса XHR, ошибки валидации будут возвращены с 422
HTTP-ответом.
Отключение двухфакторной аутентификации
Чтобы отключить двухфакторную аутентификацию, ваше приложение должно сделать DELETE-запрос к URL /user/two-factor-authentication
. Помните, что эндпоинтам двухфакторной аутентификации Fortify перед вызовом требуется подтверждение пароля.
Регистрация
Чтобы начать реализацию функционала регистрации, вам нужно указать Fortify, как вернуть шаблон register
. Помните, что Fortify – это безголовая библиотека аутентификации. Если вам нужна внешняя реализация функционала аутентификации Laravel, которая уже создана для вас, то вам следует использовать стартовый комплект приложения.
Вся логика визуализации шаблона register
Fortify может быть определена с помощью метода registerView
класса 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-запрос к URL /register
, определенному в Fortify.
Обработчик запроса к /register
ожидает строковые поля name
, email
/ username
, password
и password_confirmation
. Имя поля email
/ username
должно соответствовать значению конфигурации username
, определенному в файле конфигурации fortify
вашего приложения.
Если попытка регистрации будет успешной, то Fortify перенаправит вас на URI, настроенный с помощью параметра конфигурации home
в файле конфигурации fortify
вашего приложения. Если запрос был запросом XHR (аякс-запросом), будет возвращен 201
HTTP-ответ.
Если запрос не был успешным, пользователь будет перенаправлен обратно к экрану регистрации, и ошибки валидации будут доступны вам через общедоступную переменную $errors
шаблонов Blade. Или, в случае запроса XHR, ошибки валидации будут возвращены с 422
HTTP-ответом.
Настройка регистрации
Процесс валидации и создания пользователя можно настроить, изменив действие App\Actions\Fortify\CreateNewUser
, которое было создано при установке Laravel Fortify.
Сброс пароля
Запрос ссылки для сброса пароля
Чтобы начать реализацию функционала сброса пароля, вам нужно указать Fortify, как вернуть шаблон forgot-password
. Помните, что Fortify – это безголовая библиотека аутентификации. Если вам нужна внешняя реализация функционала аутентификации Laravel, которая уже создана для вас, то вам следует использовать стартовый комплект приложения.
Вся логика визуализации шаблона forgot-password
Fortify может быть определена с помощью метода requestPasswordResetLinkView
класса 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-запрос к URL /forgot-password
, определенному в Fortify.
Обработчик запроса к /forgot-password
ожидает строковое поле email
. Имя этого поля / столбца базы данных должно соответствовать значению конфигурации email
, определенному в файле конфигурации fortify
вашего приложения.
Обработка ответа на запрос ссылки для сброса пароля
Если запрос ссылки для сброса пароля был успешным, то Fortify перенаправит пользователя обратно на конечную точку /forgot-password
и отправит пользователю электронное письмо с защищенной ссылкой, которую он может использовать для сброса своего пароля. Если запрос был запросом XHR (аякс-запросом), будет возвращен 200
HTTP-ответ.
После перенаправления обратно к URL /forgot-password
после успешного запроса переменная сессии 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, ошибки валидации будут возвращены с 422
HTTP-ответом.
Отображение страницы сброса пароля
Чтобы завершить реализацию функционала сброса пароля вашего приложения, вам нужно указать 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
, который возвращает этот шаблон. Ваш шаблон reset-password
должен включать форму, которая выполняет POST-запрос к URL /reset-password
, определенному в Fortify.
Обработчик запроса к /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 (аякс-запросом), будет возвращен 200
HTTP-ответ.
Если запрос не был успешным, пользователь будет перенаправлен обратно к экрану сброса пароля, и ошибки валидации будут доступны вам через общедоступную переменную $errors
шаблонов Blade. Или, в случае запроса XHR, ошибки валидации будут возвращены с 422
HTTP-ответом.
Настройка сброса пароля
Процесс сброса пароля можно настроить, изменив действие App\Actions\ResetUserPassword
, которое было создано при установке Laravel Fortify.
Подтверждение адреса электронной почты
После регистрации вы можете пожелать, чтобы пользователь подтвердил свой адрес электронной почты, прежде чем он продолжит взаимодействие с вашим приложением. Для начала убедитесь, что функционал emailVerification
включен в массиве features
вашего файла конфигурации fortify
. Затем вы должны убедиться, что ваш класс App\Models\User
реализует интерфейс Illuminate\Contracts\Auth\MustVerifyEmail
.
После завершения этих двух шагов настройки вновь зарегистрированные пользователи получат электронное письмо с предложением подтвердить свой адрес электронной почты. Однако, мы должны сообщить Fortify, как отображать экран подтверждения электронной почты, который информирует пользователя о том, что им нужно перейти по ссылке для подтверждения в электронном письме.
Вся логика визуализации шаблона verify-email
Fortify может быть определена с помощью метода verifyEmailView
класса 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
.
Ваш шаблон verify-email
должен включать информационное сообщение, предлагающее пользователю щелкнуть ссылку для подтверждения электронной почты, которая была отправлена на его адрес электронной почты.
Повторная отправка ссылок для подтверждения электронной почты
При желании вы можете добавить в шаблон вашего приложения verify-email
кнопку, которая запускает POST-запрос к URL /email/verification-notification
. Когда этот эндпоинт получает запрос, пользователю будет отправлена новая ссылка для подтверждения электронной почты, позволяющая пользователю получить новую ссылку для подтверждения, если предыдущая была случайно удалена или утеряна.
Если запрос на повторную отправку электронного письма со ссылкой для подтверждения был успешным, Fortify перенаправит пользователя обратно на урл /email/verify
с переменной сессии status
, что позволит вам отобразить информационное сообщение для пользователя, информирующее его о том, что операция была выполнена успешно. Если запрос был запросом XHR (аякс-запросом), будет возвращен 202
HTTP-ответ.
@if (session('status') == 'verification-link-sent')
<div class="mb-4 font-medium text-sm text-green-600">
Вам отправлена новая ссылка для подтверждения адреса электронной почты!
</div>
@endif
Защита маршрутов
Чтобы указать, что для маршрута или группы маршрутов требуется, чтобы пользователь подтвердил свой адрес электронной почты, то вам следует назначить маршруту встроенным в Laravel посредника verify
. Псевдоним посредника verified
автоматически регистрируется Laravel и служит псевдонимом для посредника Illuminate\Auth\Middleware\EnsureEmailIsVerified
:
Route::get('/dashboard', function () {
// ...
})->middleware(['verified']);
Подтверждение пароля
При создании приложения вы можете потребовать от пользователя подтверждения пароля перед выполнением действия. Как правило, эти маршруты защищены встроенным в Laravel посредником password.confirm
.
Чтобы начать реализацию функционала подтверждения пароля, вам нужно указать Fortify, как вернуть шаблон confirm-password
. Помните, что Fortify – это безголовая библиотека аутентификации. Если вам нужна внешняя реализация функционала аутентификации Laravel, которая уже создана для вас, то вам следует использовать стартовый комплект приложения.
Вся логика визуализации шаблона confirm-password
Fortify может быть определена с помощью метода confirmPasswordView
класса Laravel\Fortify\Fortify
. Обычно этот метод следует вызывать из метода boot
класса App\Providers\FortifyServiceProvider
вашего приложения:
use Laravel\Fortify\Fortify;
/**
* Загрузка любых служб приложения.
*/
public function boot(): void
{
Fortify::confirmPasswordView(function () {
return view('auth.confirm-password');
});
// ...
}
Этот шаблон отобразится при обращении к URL /user/confirm-password
. Ваш шаблон confirm-password
должен включать форму, которая выполняет POST-запрос к URL /user/confirm-password
. Обработчик запроса к /user/confirm-password
ожидает поле password
, которое содержит текущий пароль пользователя.
Если пароль совпадает с текущим паролем пользователя, Fortify перенаправит пользователя на маршрут, к которому он пытался получить доступ. Если запрос был запросом XHR (аякс-запросом), будет возвращен 201
HTTP-ответ.
Если запрос не был успешным, пользователь будет перенаправлен обратно к экрану сброса пароля, и ошибки валидации будут доступны вам через общедоступную переменную $errors
шаблонов Blade. Или, в случае запроса XHR, ошибки валидации будут возвращены с 422
HTTP-ответом.