Підтвердження електронної пошти
Вступ
Багато вебзастосунків вимагають, щоб користувачі підтвердили свої адреси електронної пошти, перш ніж почати користуватися застосунком. Замість того щоб змушувати вас реалізовувати цю можливість вручну в кожному новому застосунку, Laravel надає зручні вбудовані сервіси для надсилання та перевірки запитів на підтвердження пошти.
Хочете швидко почати? Встановіть один зі стартових наборів застосунку Laravel у свіжий застосунок Laravel. Стартові набори створять усю вашу систему автентифікації, зокрема й підтримку підтвердження електронної пошти.
Підготовка моделі
Перш ніж почати, переконайтеся, що ваша модель App\Models\User реалізує контракт Illuminate\Contracts\Auth\MustVerifyEmail:
<?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;
// ...
}
Щойно цей інтерфейс додано до вашої моделі, новозареєстрованим користувачам автоматично надсилатиметься лист із посиланням для підтвердження пошти. Це відбувається непомітно, бо Laravel автоматично реєструє слухач Illuminate\Auth\Listeners\SendEmailVerificationNotification для події Illuminate\Auth\Events\Registered.
Якщо ви реалізуєте реєстрацію у своєму застосунку вручну, а не через стартовий набір, переконайтеся, що після успішної реєстрації користувача ви відправляєте подію Illuminate\Auth\Events\Registered:
use Illuminate\Auth\Events\Registered;
event(new Registered($user));
Підготовка бази даних
Далі ваша таблиця users має містити стовпець email_verified_at, щоб зберігати дату й час підтвердження адреси електронної пошти користувача. Зазвичай він уже є в стандартній міграції Laravel 0001_01_01_000000_create_users_table.php.
Маршрутизація
Щоб належно реалізувати підтвердження електронної пошти, знадобиться визначити три маршрути. Перший маршрут показуватиме користувачеві повідомлення про те, що йому слід натиснути посилання для підтвердження в листі, який Laravel надіслав після реєстрації.
Другий маршрут оброблятиме запити, що виникають, коли користувач натискає посилання для підтвердження в листі.
Третій маршрут повторно надсилатиме посилання для підтвердження, якщо користувач випадково втратив перше.
Повідомлення про підтвердження пошти
Як згадувалося раніше, слід визначити маршрут, який повертатиме представлення з проханням натиснути посилання для підтвердження, надіслане користувачеві після реєстрації. Це представлення показуватиметься користувачам, коли вони спробують дістатися інших частин застосунку, не підтвердивши спершу свою адресу електронної пошти. Пам'ятайте: посилання надсилається користувачеві автоматично, якщо ваша модель App\Models\User реалізує інтерфейс MustVerifyEmail:
Route::get('/email/verify', function () {
return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');
Маршрут, що повертає повідомлення про підтвердження пошти, має називатися verification.notice. Важливо дати маршруту саме це ім'я, бо middleware verified зі складу Laravel автоматично перенаправлятиме на маршрут із цим іменем, якщо користувач не підтвердив свою адресу електронної пошти.
Реалізуючи підтвердження пошти вручну, ви маєте самі визначити вміст представлення з повідомленням. Якщо вам потрібен готовий каркас з усіма потрібними представленнями автентифікації та підтвердження, погляньте на стартові набори застосунку Laravel.
Обробник підтвердження пошти
Далі нам треба визначити маршрут, який оброблятиме запити, що виникають, коли користувач натискає надіслане йому посилання для підтвердження. Цей маршрут має називатися verification.verify і мати middleware 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');
Захист маршрутів
Маршрутне middleware дозволяє пускати на певний маршрут лише користувачів із підтвердженою поштою. Laravel містить аліас middleware verified - це аліас для класу middleware Illuminate\Auth\Middleware\EnsureEmailIsVerified. Оскільки Laravel уже реєструє цей аліас автоматично, вам залишається тільки додати middleware verified до визначення маршруту. Зазвичай його поєднують із middleware auth:
Route::get('/profile', function () {
// Only verified users may access this route...
})->middleware(['auth', 'verified']);
Якщо користувач із непідтвердженою поштою спробує дістатися маршруту з цим middleware, його автоматично перенаправить на іменований маршрут verification.notice.
Налаштування
Налаштування листа з підтвердженням
Хоча стандартне сповіщення про підтвердження пошти задовольняє вимоги більшості застосунків, Laravel дозволяє налаштувати те, як формується поштове повідомлення з підтвердженням.
Для початку передайте замикання методу toMailUsing, який надає сповіщення Illuminate\Auth\Notifications\VerifyEmail. Замикання отримає екземпляр моделі-отримувача сповіщення, а також підписаний URL підтвердження, за яким користувач має перейти, щоб підтвердити свою адресу. Замикання має повернути екземпляр Illuminate\Notifications\Messages\MailMessage. Зазвичай метод toMailUsing викликають у методі boot класу AppServiceProvider вашого застосунку:
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;
/**
* Bootstrap any application services.
*/
public function boot(): void
{
// ...
VerifyEmail::toMailUsing(function (object $notifiable, string $url) {
return (new MailMessage)
->subject('Verify Email Address')
->line('Click the button below to verify your email address.')
->action('Verify Email Address', $url);
});
}
Щоб дізнатися більше про поштові сповіщення, зверніться до документації про поштові сповіщення.
Події
Коли ви користуєтеся стартовими наборами застосунку Laravel, Laravel відправляє подію Illuminate\Auth\Events\Verified під час процесу підтвердження пошти. Якщо ви обробляєте підтвердження пошти у своєму застосунку вручну, вам може знадобитися відправляти ці події самостійно після завершення підтвердження.