Двухфакторная аутентификация
Двухфакторная аутентификация (2FA) добавляет дополнительный уровень безопасности, требуя TOTP-код из приложения-аутентификатора помимо пароля.
Как это работает
- Генерация — сервер создаёт TOTP-секрет и возвращает URL для QR-кода
- Сканирование — пользователь сканирует QR-код в приложении-аутентификаторе (Google Authenticator, Authy и т.д.)
- Включение — пользователь вводит действительный TOTP-код для подтверждения настройки
- Вход — после проверки пароля пользователь должен ввести TOTP-код
API Эндпоинты
| Метод | Путь | Описание |
|---|---|---|
POST | /api/auth/2fa/generate | Генерация секрета 2FA + URL QR-кода |
POST | /api/auth/2fa/enable | Включение 2FA (проверка TOTP-кода) |
POST | /api/auth/2fa/disable | Отключение 2FA (проверка TOTP-кода) |
Prisma модель
Состояние 2FA хранится непосредственно в модели User:
prisma
model User {
// ... другие поля
twoFactorSecret String?
twoFactorEnabled Boolean @default(false)
}Фронтенд
Компонент TwoFactorSetup
Компонент TwoFactorSetup.vue в настройках предоставляет:
- Кнопку Генерировать — вызывает
POST /api/auth/2fa/generate, отображает QR-код - Поле Проверить и включить — пользователь вводит TOTP-код, вызывается
POST /api/auth/2fa/enable - Кнопку Отключить — требуется подтверждение TOTP-кодом, вызывается
POST /api/auth/2fa/disable - Индикатор текущего состояния 2FA
Ключевые детали
- Секрет генерируется сервер-side с использованием библиотеки
speakeasy - URL QR-кода следует протоколу
otpauth://для совместимости с приложениями-аутентификаторами - Включение 2FA требует предварительной проверки действительного кода (предотвращает блокировку)
- Отключение 2FA также требует действительного TOTP-кода (предотвращает несанкционированное удаление)
- Секрет хранится в зашифрованном виде в базе данных