Skip to content
Icon

ПРЕДУПРЕЖДЕНИЕ Вы просматриваете документацию к старой версии Laravel. Рассмотрите возможность обновления Вашего проекта до Laravel 9.x.

Подтверждение по элетронной почте

Введение

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

{tip} Хотите начать быстро? Установите один из стартовых наборов приложений Laravel в новое приложение Laravel. Стартовые комплекты позаботятся о создании всей вашей системы аутентификации, включая поддержку проверки электронной почты.

Подготовка модели

Прежде чем начать, убедитесь, что ваша модель App\Models\User реализует контракт Illuminate\Contracts\Auth\MustVerifyEmail contract:

<?php
 
namespace App\Models;
 
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
 
class User extends Authenticatable implements MustVerifyEmail
{
use Notifiable;
 
// ...
}

Как только этот интерфейс будет добавлен в вашу модель, новым зарегистрированным пользователям будет автоматически отправлено электронное письмо, содержащее ссылку для подтверждения электронной почты. Как вы можете видеть, изучив App\Providers\EventServiceProvider вашего приложения, Laravel уже содержит SendEmailVerificationNotification слушатель, который прикреплен к событию Illuminate\Auth\Events\Registered. Этот прослушиватель событий отправит пользователю ссылку для подтверждения по электронной почте.

Если вы вручную реализуете регистрацию в своем приложении вместо использования стартового комплекта, вы должны убедиться, что вы отправляете событие Illuminate\Auth\Events\Registered после успешной регистрации пользователя:

use Illuminate\Auth\Events\Registered;
 
event(new Registered($user));

Подготовка базы данных

Далее, ваша таблица users должна содержать столбец email_verified_at для хранения даты и времени подтверждения адреса электронной почты пользователя. По умолчанию миграция таблицы пользователей users, включенная в структуру Laravel, уже включает этот столбец. Итак, все, что вам нужно сделать, это запустить миграцию базы данных:

php artisan migrate

Маршрутизация

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

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

В-третьих, потребуется маршрут для повторной отправки ссылки для подтверждения, если пользователь случайно потеряет первую ссылку для подтверждения.

Уведомление о подтверждении электронной почты

Как упоминалось ранее, должен быть определен маршрут, который будет возвращать представление, инструктирующее пользователя щелкнуть ссылку подтверждения электронной почты, отправленную им по электронной почте Laravel после регистрации. Это представление будет отображаться для пользователей, когда они попытаются получить доступ к другим частям приложения без предварительной проверки своего адреса электронной почты. Помните, что ссылка автоматически отправляется пользователю по электронной почте, если ваша модель App\Models\User реализует интерфейс MustVerifyEmail:

Route::get('/email/verify', function () {
return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');

Маршрут, который возвращает уведомление о подтверждении электронной почты, должен называться verification.notice. Важно, чтобы маршруту было присвоено именно это имя, так как мидлвар verified, входящий в состав Laravel будет автоматически перенаправлять на это имя маршрута, если пользователь не подтвердил свой адрес электронной почты.

{tip} При ручной проверке электронной почты вы должны сами определить содержимое представления уведомления о проверке. Если вам нужны шаблоны, включающие все необходимые представления аутентификации и верификации, ознакомьтесь со стартовыми наборами приложений Laravel.

Обработчик проверки электронной почты

Затем нам нужно определить маршрут, который будет обрабатывать запросы, генерируемые, когда пользователь щелкает ссылку подтверждения электронной почты, которая была отправлена ему по электронной почте. Этот маршрут должен называться verification.verify и ему должны быть назначены мидлвары auth и signed:

use Illuminate\Foundation\Auth\EmailVerificationRequest;
 
Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
$request->fulfill();
 
return redirect('/home');
})->middleware(['auth', 'signed'])->name('verification.verify');

Прежде чем двигаться дальше, давайте подробнее рассмотрим этот маршрут. Во-первых, вы заметите, что мы используем тип запроса EmailVerificationRequest вместо типичного экземпляра Illuminate\Http\Request. EmailVerificationRequest — это запрос формы, который включен в Laravel. Этот запрос автоматически позаботится о проверке параметров запроса id и hash.

Далее мы можем перейти непосредственно к вызову метода fulfill в запросе. Этот метод вызовет метод markEmailAsVerified для аутентифицированного пользователя и отправит событие Illuminate\Auth\Events\Verified. Метод markEmailAsVerified доступен для модели App\Models\User по умолчанию через базовый класс Illuminate\Foundation\Auth\User. Как только адрес электронной почты пользователя будет подтвержден, вы можете перенаправить его куда угодно.

Повторная отправка письма с подтверждением

Иногда пользователь может потерять или случайно удалить электронное письмо с подтверждением адреса электронной почты. Чтобы учесть это, вы можете определить маршрут, позволяющий пользователю запросить повторную отправку письма с подтверждением. Затем вы можете сделать запрос на этот маршрут, разместив простую кнопку отправки формы в представлении уведомления о подтверждении:

use Illuminate\Http\Request;
 
Route::post('/email/verification-notification', function (Request $request) {
$request->user()->sendEmailVerificationNotification();
 
return back()->with('message', 'Verification link sent!');
})->middleware(['auth', 'throttle:6,1'])->name('verification.send');

Защита маршрутов

Мидлвар маршрута может использоваться для предоставления доступа к данному маршруту только проверенным пользователям. Laravel поставляется с verified мидлваром, который ссылается на класс Illuminate\Auth\Middleware\EnsureEmailIsVerified. Поскольку этот мидлвар уже зарегистрирован в ядре HTTP вашего приложения, все, что вам нужно сделать, это прикрепить мидлвар к определению маршрута:

Route::get('/profile', function () {
// Only verified users may access this route...
})->middleware('verified');

Если неподтвержденный пользователь попытается получить доступ к маршруту, которому назначено это мидлвар, он будет автоматически перенаправлен на verification.notice именованный маршрут.

Настройка

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

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

Для начала передайте замыкание методу toMailUsing предоставленному уведомлением Illuminate\Auth\Notifications\VerifyEmail. Замыкание получит уведомляемый экземпляр модели, который получает уведомление, а также подписанный URL-адрес подтверждения электронной почты, который пользователь должен посетить, чтобы подтвердить свой адрес электронной почты. Замыкание должно возвращать экземпляр Illuminate\Notifications\Messages\MailMessage. Как правило, вы должны вызывать метод toMailUsing из метода boot класса App\Providers\AuthServiceProvider вашего приложения:

use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;
 
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
// ...
 
VerifyEmail::toMailUsing(function ($notifiable, $url) {
return (new MailMessage)
->subject('Verify Email Address')
->line('Click the button below to verify your email address.')
->action('Verify Email Address', $url);
});
}

{tip} Чтобы узнать больше о почтовых уведомлениях, обратитесь к документации по почтовым уведомлениям.

События

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

/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'Illuminate\Auth\Events\Verified' => [
'App\Listeners\LogVerifiedUser',
],
];