Verification: a143cc29221c9be0

Php code for reset password

Введение

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 с помощью команды vendor:publish:

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

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

Затем, вы должны применить миграции вашей базу данных:

php artisan migrate

Поставщик службы Fortify

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

Поставщик службы Fortify регистрирует действия, которые публикуются 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, который отвечает за отображение шаблона «сброса пароля» вашего приложения. Это необходимо, потому что уведомление 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()
    {
        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()
{
    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.

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

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

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

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-запрос к урлу /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 text-green-600">
        Включена двухфакторная аутентификация.
    div>
@endif

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

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

Если вы создаете интерфейс на основе JavaScript, то вы можете сделать XHR GET-запрос (аякс-запрос) к урлу /user/two-factor-qr-code, чтобы получить QR-код для двухфакторной аутентификации пользователя. Этот эндпоинт вернет объект JSON, содержащий ключ svg.

Отображение кодов восстановления

Вы также должны отобразить коды двухфакторного восстановления пользователя. Эти коды восстановления позволяют пользователю пройти аутентификацию, если он потеряет доступ к своему мобильному устройству. Если вы используете 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, как вернуть наш шаблон two-factor-challenge. Вся логика визуализации шаблона two-factor-challenge Fortify может быть определена с помощью метода twoFactorChallengeView класса Laravel\Fortify\Fortify. Обычно этот метод следует вызывать из метода boot класса App\Providers\FortifyServiceProvider вашего приложения:

use Laravel\Fortify\Fortify;


public function boot()
{
    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, будет возвращен 204 HTTP-ответ.

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

Отключение двухфакторной аутентификации

Чтобы отключить двухфакторную аутентификацию, ваше приложение должно сделать DELETE-запрос к урлу /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()
{
    Fortify::registerView(function () {
        return view('auth.register'); 
    });

    
}

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

Обработчик запроса к /register ожидает строковые поля name, email / username, password и password_confirmation. Имя поля email / username должно соответствовать значению конфигурации username, определенному в файле конфигурации fortify вашего приложения.

Если попытка регистрации будет успешной, то Fortify перенаправит вас на URI, настроенный с помощью параметра конфигурации home в файле конфигурации fortify вашего приложения. Если запрос на вход был запросом XHR (аякс-запросом), будет возвращен 200 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()
{
    Fortify::requestPasswordResetLinkView(function () {
        return view('auth.forgot-password');
    });

    
}

Fortify позаботится об определении маршрута /forgot-password, который возвращает этот шаблон. Ваш шаблон forgot-password должен включать форму, которая выполняет POST-запрос к урлу /forgot-password, определенному в Fortify.

Обработчик запроса к /forgot-password ожидает строковое поле email. Имя этого поля / столбца базы данных должно соответствовать значению конфигурации email, определенному в файле конфигурации fortify вашего приложения.

Обработка ответа на запрос ссылки для сброса пароля

Если запрос ссылки для сброса пароля был успешным, то Fortify перенаправит пользователя обратно на конечную точку /forgot-password и отправит пользователю электронное письмо с защищенной ссылкой, которую он может использовать для сброса своего пароля. Если запрос был запросом XHR (аякс-запросом), будет возвращен 200 HTTP-ответ.

После перенаправления обратно к урлу /forgot-password после успешного запроса переменная сессии status может использоваться для отображения состояния попытки запроса ссылки для сброса пароля. Значение этой переменной сессии будет соответствовать одной из строк перевода, определенных в языковом файле passwords вашего приложения:

@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.

Вся логика визуализации шаблона reset-password Fortify может быть определена с помощью метода resetPasswordView класса Laravel\Fortify\Fortify. Обычно этот метод следует вызывать из метода boot класса App\Providers\FortifyServiceProvider вашего приложения:

use Laravel\Fortify\Fortify;


public function boot()
{
    Fortify::resetPasswordView(function ($request) {
        return view('auth.reset-password', ['request' => $request]);
    });

    
}

Fortify позаботится об определении маршрута /reset-password, который возвращает этот шаблон. Ваш шаблон reset-password должен включать форму, которая выполняет POST-запрос к урлу /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()
{
    Fortify::verifyEmailView(function () {
        return view('auth.verify-email');
    });

    
}

Fortify позаботится об определении маршрута, который отображает этот шаблон, когда пользователь перенаправляется на урл /email/verify встроенным в Laravel посредником verified.

Ваш шаблон verify-email должен включать информационное сообщение, предлагающее пользователю щелкнуть ссылку для подтверждения электронной почты, которая была отправлена на его адрес электронной почты.

Повторная отправка ссылок для подтверждения электронной почты

При желании вы можете добавить в шаблон вашего приложения verify-email кнопку, которая запускает POST-запрос к урлу /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. Этот посредник зарегистрирован в классе вашего приложения App\Http\Kernel:

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