Добавянето на двуфакторна автентикация (2FA) в уеб приложение може да се реализира по няколко основни начина, в зависимост от нивото на сигурност, UX и сложност, които се търсят.
1. TOTP (Time-based One-Time Password) – най-често използваният вариант
Генерира се код на всеки ~30 секунди.
Как работи:
- При регистрация генерираш secret ключ
- Показваш QR код
- Потребителят го сканира с приложение като Google Authenticator или Microsoft Authenticator
- При логин въвежда код от приложението
PHP библиотеки:
spomky-labs/otphprobthree/twofactorauthsonata-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:
- Username + password
- Ако е валиден → 2FA challenge
- При успех → login
Практическа препоръка
За PHP приложение (особено SaaS или admin панели):
- Основен метод: TOTP
- Backup: recovery codes
- По желание: WebAuthn за power users
SMS и email използвай само като fallback, не като основен метод.