Версія фреймворка: 8.x

Підтвердження електронної пошти

Вступ

Багато веб-додатків вимагають від користувачів підтвердження своїх електронних адрес перед використанням програми. Замість того, щоб змушувати вас повторно впроваджувати це в кожній програмі, Laravel пропонує зручні методи надсилання та перевірки запитів на перевірку електронної пошти.

Хочете швидко розпочати? ВстановитиLaravel Jetstreamу свіжому додатку Laravel. Після міграції бази даних перейдіть до браузера/registerабо будь-яку іншу URL-адресу, призначену вашій програмі. Jetstream подбає про побудову всієї вашої системи автентифікації, включаючи підтримку перевірки електронної пошти!

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

Для початку переконайтеся, що ваш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;

    // ...
}

Як тільки цей інтерфейс буде додано до вашої моделі, нещодавно зареєстрованим користувачам автоматично буде надіслано електронне повідомлення із посиланням для підтвердження електронної пошти. Як ви можете бачити, вивчивши вашEventServiceProvider, Laravel вже містить aSendEmailVerificationNotificationслухачщо додається доIlluminate\Auth\Events\Registeredподія.

Якщо ви вручну здійснюєте реєстрацію в своїй заявці, а не використовуєтеLaravel Jetstream, ви повинні переконатися, що ви відправляєтеIlluminate\Auth\Events\Registeredподія після успішної реєстрації користувача:

use Illuminate\Auth\Events\Registered;

event(new Registered($user));

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

Далі, вашuserтаблиця повинна міститиemail_verified_atдля збереження дати та часу підтвердження адреси електронної пошти. За замовчуваннямusersміграція таблиці, що входить до фреймворку Laravel, уже містить цей стовпець. Отже, все, що вам потрібно зробити, це запустити міграції бази даних:

php artisan migrate

Routing

Щоб правильно здійснити перевірку електронної пошти, потрібно визначити три маршрути. По-перше, потрібен маршрут для відображення повідомлення користувачеві про те, що він повинен натиснути посилання для підтвердження електронної пошти в електронному листі для підтвердження, який Laravel надіслав їм після реєстрації. По-друге, потрібен буде маршрут для обробки запитів, що генеруються, коли користувач натискає посилання для підтвердження електронної пошти в електронному листі. По-третє, потрібен буде маршрут для повторної відправки посилання для підтвердження, якщо користувач випадково втратить перший.

Повідомлення про підтвердження електронної пошти

Як вже згадувалося раніше, слід визначити маршрут, який поверне View з вказівкою користувачеві натиснути посилання для підтвердження електронної пошти, надіслане їм електронною поштою від Laravel. Це представлення відображатиметься користувачам, коли вони намагатимуться отримати доступ до інших частин програми, не попередньо перевіривши свою електронну адресу. Пам’ятайте, що посилання автоматично надсилається користувачеві, поки вашApp\Models\Userмодель реалізуєMustVerifyEmailінтерфейс:

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

Маршрут, який повертає повідомлення про перевірку електронної пошти, повинен бути названийverification.notice. Важливо, щоб маршруту було присвоєно саме цю назву, оскількиverifiedMiddlwareвходить до складу Laravelавтоматично перенаправить на цю назву маршруту, якщо користувач не підтвердив свою адресу електронної пошти.

При ручному впровадженні перевірки електронної пошти вам потрібно самостійно визначити вміст View повідомлення про перевірку. Якщо вам потрібні будівельні ліси, що включають усі необхідні View автентифікації та перевірки, відвідайтеLaravel Jetstream.

Обробник підтвердження електронної пошти

Далі нам потрібен маршрут, який оброблятиме запити, що генеруються, коли користувач натискає посилання для підтвердження електронної пошти, яке було надіслане йому електронною поштою. Цей маршрут слід назватиverification.verifyі присвоїтиauthіsignedпроміжні засоби:

use Illuminate\Foundation\Auth\EmailVerificationRequest;
use Illuminate\Http\Request;

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базовий клас. Після підтвердження електронної адреси користувача ви можете перенаправити їх куди завгодно.

Повторна відправка електронного листа для підтвердження

Іноді користувач може неправильно або випадково видалити електронну адресу для підтвердження електронної адреси. Щоб це зробити, ви можете визначити маршрут, щоб дозволити користувачеві вимагати повторної перевірки електронного листа. Потім ви можете зробити запит на цей маршрут, розмістивши просту кнопку View форми у вашомуперегляд повідомлення про перевірку:

use Illuminate\Http\Request;

Route::post('/email/verification-notification', function (Request $request) {
    $request->user()->sendEmailVerificationNotification();

    return back()->with('status', 'verification-link-sent');
})->middleware(['auth', 'throttle:6,1'])->name('verification.send');

Захист маршрутів

Маршрутизуйте Middlwareможе використовуватися, щоб дозволити лише перевіреним користувачам доступ до заданого маршруту. Laravel кораблі зverifiedMiddlware, яке посилається наIlluminate\Auth\Middleware\EnsureEmailIsVerifiedклас. Оскільки це Middlware вже зареєстроване в ядрі HTTP вашої програми, все, що вам потрібно зробити, це приєднати Middlware до визначення маршруту:

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

Якщо неперевірений користувач намагається отримати доступ до маршруту, якому було призначено це Middlware, він буде автоматично перенаправлений наverification.noticeназваний маршрут.

Події

При використанніLaravel Jetstream, Відправлення Laravelподіїпід час процесу перевірки електронної пошти. Якщо ви вручну обробляєте підтвердження електронної пошти для своєї програми, можливо, ви захочете вручну надіслати ці події після завершення перевірки. Ви можете приєднати слухачів до цих подій у своємуEventServiceProvider:

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