Продължете към съдържанието

Добавянето на двуфакторна автентикация (2FA) в уеб приложение може да се реализира по няколко основни начина, в зависимост от нивото на сигурност, UX и сложност, които се търсят.

1. TOTP (Time-based One-Time Password) – най-често използваният вариант

Генерира се код на всеки ~30 секунди.

Как работи:

  • При регистрация генерираш secret ключ
  • Показваш QR код
  • Потребителят го сканира с приложение като Google Authenticator или Microsoft Authenticator
  • При логин въвежда код от приложението

PHP библиотеки:

  • spomky-labs/otphp
  • robthree/twofactorauth
  • sonata-project/google-authenticator

Плюсове:

  • Висока сигурност
  • Без зависимост от външни услуги

Минуси:

  • Изисква setup от потребителя
  • Няма recovery без backup кодове

2. SMS базирана 2FA

Изпращаш код чрез SMS.

Как работи:

  • Генерираш еднократен код
  • Изпращаш го чрез SMS API (напр. Twilio)

Плюсове:

  • Лесен UX
  • Не изисква app

Минуси:

  • По-ниска сигурност (SIM swap атаки)
  • Разходи за SMS

3. Email базирана 2FA

Кодът се изпраща на имейл.

Плюсове:

  • Най-лесен за имплементация
  • Без допълнителни разходи

Минуси:

  • Най-слабата сигурност
  • Ако имейлът е компрометиран → 2FA отпада

4. Push нотификации (modern UX)

Използват се външни услуги.

Примери:

  • Authy
  • Duo Security

Как работи:

  • Потребителят получава push: “Allow / Deny”

Плюсове:

  • Отличен UX
  • По-сигурно от SMS

Минуси:

  • Зависимост от външен доставчик
  • По-сложна интеграция

5. WebAuthn / FIDO2 (passwordless / hardware keys)

Най-високо ниво на сигурност.

Примери:

  • YubiKey
  • Вградено в браузъри (Face ID, Windows Hello)

PHP библиотеки:

  • web-auth/webauthn-lib

Плюсове:

  • Фишинг-резистентно
  • Без пароли (по желание)

Минуси:

  • По-сложно за имплементация
  • UX бариера за масов потребител

6. Backup кодове (задължително допълнение)

Независимо от метода:

  • Генерирай 5–10 еднократни backup кода
  • Съхранявай ги хеширани

Архитектурни насоки

Минимална добра имплементация:

  • Парола + TOTP
  • Backup кодове
  • Rate limiting (за brute force)
  • Session marking (“2FA verified”)

Flow:

  1. Username + password
  2. Ако е валиден → 2FA challenge
  3. При успех → login

Практическа препоръка

За PHP приложение (особено SaaS или admin панели):

  • Основен метод: TOTP
  • Backup: recovery codes
  • По желание: WebAuthn за power users

SMS и email използвай само като fallback, не като основен метод.