Skip to content

Двухфакторная аутентификация

Двухфакторная аутентификация (2FA) добавляет дополнительный уровень безопасности, требуя TOTP-код из приложения-аутентификатора помимо пароля.

Как это работает

  1. Генерация — сервер создаёт TOTP-секрет и возвращает URL для QR-кода
  2. Сканирование — пользователь сканирует QR-код в приложении-аутентификаторе (Google Authenticator, Authy и т.д.)
  3. Включение — пользователь вводит действительный TOTP-код для подтверждения настройки
  4. Вход — после проверки пароля пользователь должен ввести 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-кода (предотвращает несанкционированное удаление)
  • Секрет хранится в зашифрованном виде в базе данных