Підтвердження пошти · Laravel
Багато веб-застосунків вимагають, щоб користувачі підтверджували свої адреси електронної пошти перед тим, як користуватися застосунком. Замість того щоб змушувати вас реалізовувати цю можливість вручну для кожного застосунку, 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 надіслав йому після реєстрації.
Другий маршрут обробляє запити, що виникають, коли користувач натискає посилання для підтвердження пошти в листі.
Третій маршрут повторно надсилає посилання для підтвердження, якщо користувач випадково загубив перше.
Повідомлення про підтвердження пошти
Як згадано вище, потрібно визначити маршрут, який повертає представлення (view) з проханням натиснути посилання для підтвердження пошти, надіслане 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 - це form request, що входить до складу 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 () {
// Доступ до цього маршруту мають лише підтверджені користувачі...
})->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 під час процесу підтвердження пошти. Якщо ви обробляєте підтвердження пошти у своєму застосунку вручну, можливо, вам варто диспетчеризувати ці події самостійно після завершення підтвердження.
Перекладаємо з офіційної документації, розділ за розділом, і не ховаємо недоперекладене. Помітили неточність у терміні чи реченні: напишіть, виправимо.