Підтвердження електронної пошти
Вступ
Багато веб-застосунків вимагають від користувачів підтвердити свої електронні адреси перед використанням застосунку. Замість того, щоб змушувати вас повторно реалізовувати цю функцію вручну для кожного створеного вами застосунку, 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 надіслав їм після реєстрації.
По-друге, потрібен маршрут для обробки запитів, що генеруються, коли користувач натискає на посилання для підтвердження електронної пошти в листі.
Третє, знадобиться маршрут для повторного відправлення посилання для верифікації, якщо користувач випадково втратить перше посилання для верифікації.
Сповіщення про підтвердження електронної пошти
Як згадувалося раніше, слід визначити маршрут, який повертатиме представлення, що інструктує користувача натиснути на посилання для верифікації електронної пошти, яке було надіслано їм Laravel після реєстрації. Це представлення буде відображатися користувачам, коли вони намагатимуться отримати доступ до інших частин застосунку без попередньої верифікації їхньої електронної пошти. Пам'ятайте, посилання автоматично надсилається користувачу, якщо ваша модель App\Models\User реалізує інтерфейс MustVerifyEmail:
Route::get('/email/verify', function () {
return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');
Маршрут, який повертає повідомлення про перевірку електронної пошти, повинен мати ім'я verification.notice. Важливо, щоб маршрут був призначений саме з цим ім'ям, оскільки verified middleware включений у Laravel автоматично перенаправить на цей маршрут, якщо користувач не підтвердив свою електронну адресу.
Коли ви вручну реалізуєте перевірку електронної пошти, вам потрібно самостійно визначити вміст представлення повідомлення про перевірку. Якщо ви хочете використовувати шаблон, який включає всі необхідні представлення аутентифікації та перевірки, перегляньте стартові набори застосунків Laravel.
Обробник Підтвердження Електронної Пошти
Далі, нам потрібно визначити маршрут, який буде обробляти запити, згенеровані, коли користувач натискає на посилання для підтвердження електронної пошти, яке було надіслано їм. Цей маршрут повинен бути названий verification.verify і мати призначені auth та signed middleware:
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 включає verified псевдонім middleware, який є псевдонімом для класу middleware Illuminate\Auth\Middleware\EnsureEmailIsVerified. Оскільки цей псевдонім вже автоматично зареєстрований Laravel, все, що вам потрібно зробити, це прикріпити verified middleware до визначення маршруту. Зазвичай, це middleware поєднується з auth middleware:
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; /** * Ініціалізувати будь-які сервіси застосунку. */ 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 подію під час процесу верифікації електронної пошти. Якщо ви вручну обробляєте верифікацію електронної пошти для вашого застосунку, можливо, ви захочете вручну відправляти ці події після завершення верифікації.
