Ви запускаєте мобільний додаток із чутливими даними — фінанси, корпоративні документи, особисте листування. Логін і пароль уже не вважаються достатнім захистом: витоки баз даних, фішинг і повторне використання паролів — щоденна реальність. Двофакторна автентифікація (2FA) закриває ці ризики, додаючи другий фактор після введення облікових даних. Але який метод обрати і як впровадити без втрати UX? Ми реалізували 2FA для 20+ додатків із сумарною аудиторією 2 млн користувачів і ділимося досвідом.
Який метод 2FA обрати?
TOTP — користувач сканує QR у додатку-автентифікаторі (Google Authenticator, Microsoft Authenticator). Генерує 6-значний код кожні 30 секунд. Стандарт RFC 6238. Не потребує інтернету, не залежить від SMS, безкоштовно. Найкращий вибір для технічно грамотної аудиторії.
SMS OTP — код приходить по SMS. Знайоме масовій аудиторії, але вразливе до SIM-свопінгу, залежить від покриття, затратне при масових розсилках. Для B2C часто єдиний інтуїтивно зрозумілий варіант.
Push-сповіщення з підтвердженням — при спробі входу користувачеві приходить push із запитом «Підтвердити вхід?» (Так/Ні). Реалізується через FCM/APNs. Хороший UX, але критична доставлюваність push.
Email OTP — альтернатива SMS, вища доставлюваність, але нижче відчуття терміновості.
| Метод | Безпека | UX | Витрати | Залежності |
|---|---|---|---|---|
| TOTP | Висока | Середня (потребує встановлення додатку) | Нульові | Немає інтернету після налаштування |
| SMS OTP | Низька (SIM-свопінг) | Висока (всі знають) | $0.05–0.15 за SMS | Робота стільникової мережі |
| Push-сповіщення | Середня | Висока (одне натискання) | Робота push-інфраструктури | Доставлюваність push |
TOTP у 10 разів безпечніший за SMS (немає SIM-свопінгу) і не поступається push при правильному налаштуванні довірених пристроїв.
Чому TOTP — найкращий вибір для безпеки?
TOTP виключає залежність від каналів зв'язку: код генерується локально на пристрої, його не можна перехопити або підмінити в дорозі. На відміну від SMS, де можливий SIM-свопінг, або push, де потрібне стабільне інтернет-з'єднання, TOTP працює автономно. Середня вартість одного SMS становить $0.05–0.15 — при масовій розсилці це мільйони. TOTP безкоштовний і не потребує інфраструктури.
Реалізація TOTP
На сервері при включенні 2FA генеруємо secret (20 байт випадкових даних у Base32). Формуємо otpauth://totp/AppName:[email protected]?secret=BASE32SECRET&issuer=AppName — це URI для QR-коду.
# Python — генерація secret і перевірка коду import pyotp secret = pyotp.random_base32() # Зберігаємо в БД, прив'язаний до користувача totp = pyotp.TOTP(secret) # Перевірка введеного коду is_valid = totp.verify(user_input_code, valid_window=1) # valid_window=1 допускає коди ±30 секунд від поточного — компенсація розсинхронізації годинників QR-код генеруємо на сервері як PNG і віддаємо клієнту через захищений endpoint (тільки для авторизованого користувача). Показуємо один раз при налаштуванні — повторно показувати QR небезпечно.
На мобільному клієнті — екран введення 6-значного коду, аналогічний OTP-полю з SMS-авторизації. Автоматичний submit при введенні 6-ї цифри.
Резервні коди
При налаштуванні TOTP — обов'язково генеруємо 8–10 одноразових резервних кодів. Якщо користувач втратив телефон з Authenticator — тільки вони дозволять увійти. Показуємо один раз, пропонуємо зберегти. Зберігаємо як bcrypt-хеші. Без резервних кодів втрата телефону = втрата доступу назавжди. Ми включаємо цю опцію за замовчуванням.
Як реалізувати вимкнення 2FA безпечно?
Дати користувачеві вимкнути 2FA потрібно обережно. Мінімум: підтвердження діючим паролем + діючим 2FA кодом. Інакше зловмисник, який отримав доступ до сесії, може вимкнути захист. Ми додаємо ще й логування таких дій з наступним сповіщенням по email.
Зміна TOTP-пристрою: генеруємо новий secret, старий показуємо активним ще 5 хвилин паралельно (migration window), потім інвалідуємо.
Механізм довірених пристроїв
// iOS — генерація device token після успішної 2FA let deviceToken = UUID().uuidString let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: "device_token", kSecAttrService as String: "com.yourapp.auth", kSecValueData as String: deviceToken.data(using: .utf8)!, kSecAttrAccessible as String: kSecAttrAccessibleAfterFirstUnlock ] SecItemAdd(query as CFDictionary, nil) На Android — EncryptedSharedPreferences з AndroidKeyStore-ключем для шифрування device token.
Device token передається при вході. Сервер перевіряє: якщо токен є і відповідає користувачеві — 2FA не потрібна. Термін життя довіреного пристрою: 30–90 днів, після — повторна 2FA.
Порівняння підходів до реалізації
| Критерій | TOTP | SMS OTP | Push-2FA |
|---|---|---|---|
| Час впровадження | 2–3 тижні | 1–2 тижні | 1.5–2 тижні |
| Складність | Середня | Низька | Середня |
| Безпека | Висока | Низька | Середня |
| UX | Потребує додатку | Звично | Просте натискання |
Ми маємо 5+ років досвіду в мобільній розробці та 50+ реалізованих проєктів з 2FA. Оцінимо ваш проєкт і запропонуємо оптимальне рішення.
Що входить у роботу
Ми надаємо повний комплект:
- Документація: опис архітектури, схема потоків, інструкція для підтримки
- Вихідний код модуля 2FA (iOS/Android/Backend)
- Налаштування резервних кодів і механізму відновлення
- Інтеграція з вашою існуючою системою автентифікації
- Допомога в публікації в App Store і Google Play (врахування App Store Review Guidelines Section 5.1.1)
- Гарантія стабільної роботи протягом 30 днів після деплою
- Консультація з налаштування довірених пристроїв і вибору методу
Терміни: від 1,5 до 3 тижнів залежно від складності. TOTP з резервними кодами і довіреними пристроями — ближче до верхньої межі. SMS 2FA без device trust — близько тижня.
Зв'яжіться з нами — обговоримо деталі та підготуємо пропозицію під ключ. Отримайте консультацію та переконайтеся в якості наших рішень.







