Авторизація через email з підтвердженням: реалізація на Laravel

Реалізація авторизації через email з підтвердженням

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Авторизація через email з підтвердженням: реалізація на Laravel
Середній
від 1 дня до 3 днів

Наші компетенції:

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1418
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1285
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    983
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1242
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    983
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    997

Реалізація авторизації через email з підтвердженням

Ми часто стикаємося з задачами, де стандартна парольна аутентифікація створює більше проблем, ніж вирішує. Спам-реєстрації (до 70% від усіх спроб) забивають базу, забуті паролі генерують потік тікетів у підтримку, а витоки баз даних дискредитують сервіс. Авторизація через email з підтвердженням усуває ці ризики. Економія на підтримці становить до 500 000 гривень на рік — за рахунок зниження навантаження на службу підтримки на 80% та зменшення кількості фейкових акаунтів на 95%.

Чому email-верифікація критична для безпеки?

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

Два сценарії використання

Перший сценарій — верифікація при реєстрації. Користувач реєструється з паролем, отримує лист, підтверджує пошту — тільки після цього отримує повний доступ. Другий — passwordless вхід. Користувач вводить email, отримує лист з посиланням, клікає — авторизований без пароля. Обидва сценарії можуть співіснувати.

Як ми реалізуємо email-верифікацію під ключ?

Верифікація email при реєстрації (Laravel)

Модель User реалізує контракт MustVerifyEmail. Це зобов'язує визначити метод sendEmailVerificationNotification(), який надсилає кастомне сповіщення. Ми використовуємо вбудовану підписану URL.

class User extends Authenticatable implements MustVerifyEmail { public function sendEmailVerificationNotification(): void { $this->notify(new CustomVerifyEmailNotification()); } } Route::get('/email/verify/{id}/{hash}', [VerifyEmailController::class, '__invoke']) ->middleware(['auth', 'signed', 'throttle:6,1']) ->name('verification.verify'); 

Підписана URL генерується зі строком дії 60 хвилин. Підпис — HMAC-SHA256 з APP_KEY. Зміна параметрів повертає 403.

$url = URL::temporarySignedRoute( 'verification.verify', now()->addMinutes(60), ['id' => $user->id, 'hash' => sha1($user->email)] ); 

OTP-код замість посилання

Деякі проекти надають перевагу 6-значному коду — зручніше, якщо лист відкривають на іншому пристрої. Ми кешуємо хеш коду зі строком дії 10 хвилин і перевіряємо через hash_equals для захисту від timing attack.

$code = str_pad(random_int(0, 999999), 6, '0', STR_PAD_LEFT); Cache::put("email_verification:{$user->id}", hash('sha256', $code), now()->addMinutes(10)); public function verify(Request $request): JsonResponse { $stored = Cache::get("email_verification:{$user->id}"); if (!$stored || !hash_equals($stored, hash('sha256', $request->code))) { return response()->json(['message' => 'Невірний або застарілий код'], 422); } $user->markEmailAsVerified(); Cache::forget("email_verification:{$user->id}"); return response()->json(['message' => 'Email підтверджено']); } 

Захист від спаму та повторне надсилання

RateLimiter налаштовується так, щоб один лист можна було надіслати не частіше ніж раз на 5 хвилин. Фронтенд показує зворотний відлік до наступного надсилання. Це запобігає брутфорсу та спам-атакам.

RateLimiter::for('email-verification', function (Request $request) { return Limit::perMinutes(5, 1)->by($request->user()->id); }); 

Зміна email з підтвердженням

Безпечно змінювати email можна лише після підтвердження нової адреси. Ми вводимо поле pending_email у таблицю users або окрему таблицю. На нову адресу надсилається лист з верифікацією, і тільки після успішного підтвердження email оновлюється.

$user->update(['pending_email' => $newEmail]); // Надсилаємо верифікацію на $newEmail // При підтвердженні: $user->update(['email' => $newEmail, 'pending_email' => null]); 

Налаштування черг та моніторинг

Надсилання листів має бути асинхронним, щоб не блокувати відповідь. Ми використовуємо чергу Laravel (драйвери Redis або SQS) і налаштовуємо моніторинг через Horizon або Laravel Pulse. Якщо лист не доставлено, логуємо помилку та повідомляємо адміністратора.

Як ми впроваджуємо email-верифікацію: покроковий план

  1. Аналізуємо вимоги та обираємо сценарій (реєстрація, passwordless або обидва).
  2. Проектуємо модель даних: додаємо поля email_verified_at, pending_email, налаштовуємо зв'язок з чергою.
  3. Реалізуємо маршрути та контролери з підписаними URL або OTP.
  4. Створюємо кастомні шаблони листів (HTML + plain text).
  5. Налаштовуємо rate limiting та обробку помилок (прострочені посилання, повторні кліки).
  6. Тестуємо edge cases (зміна email, повторне надсилання, паралельні запити).
  7. Деплоїмо з використанням черг та моніторингу.

Порівняння OTP та Magic Link

Критерій OTP-код Magic Link
Зручність на одному пристрої Потрібно відкрити лист і ввести код Відразу авторизація по кліку
Безпека Код обмежений у часі, 6 цифр Підписана URL, може бути перехоплена
Реалізація Вимагає кеш та хешування Використовує signed route
Користувацький досвід Вимагає ручного введення Безшовно

Етапи реалізації

Етап Тривалість Результат
Аналіз вимог 0.5–1 день Обрано сценарій (реєстрація/passwordless)
Проектування 0.5–1 день Модель, маршрути, контролери, шаблони
Реалізація бази 0.5–1 день Поля email_verified_at, pending_email
Налаштування сповіщень 0.5–1 день Кастомний лист з посиланням або OTP
Захист та тестування 1–2 дні Rate limiting, signed URL, edge cases
Деплой 0.5 дня Черга, моніторинг, документація

Обробка прострочених посилань

Якщо користувач перейшов за простроченим посиланням, ми повертаємо зрозуміле повідомлення та кнопку «Вислати новий лист». При повторному кліку по вже підтвердженому посиланню повертаємо 200 з повідомленням, що email вже верифіковано.

Типові помилки та їх вирішення

  • Прострочене посилання: показуємо повідомлення та пропонуємо повторне надсилання.
  • Повторний клік по посиланню: повертаємо 200 з повідомленням, що email вже підтверджено.
  • Відсутність черги: надсилання листів синхронно сповільнює відповідь — ми використовуємо чергу Laravel.

Що ви отримуєте в результаті

  • Повний вихідний код з коментарями (моделі, контролери, сповіщення).
  • Кастомні шаблони листів, адаптовані під ваш бренд.
  • Налаштування черг та моніторингу (Laravel Horizon/Pulse).
  • Документація для розробників з розгортання та підтримки.
  • Гарантія та підтримка протягом 30 днів після впровадження.

Зв'яжіться з нами для консультації — оцінимо ваш проект та запропонуємо оптимальне рішення. Замовте впровадження під ключ і отримайте готову систему авторизації в найкоротші терміни.