TOTP-код двухфакторной авторизации зависит от общего секрета и текущего времени. Если часы сервера ушли вперед или назад, приложение отклоняет правильные коды со смартфона, хотя пароль пользователя принимается.

Не увеличивайте окно проверки до нескольких минут как постоянное решение. Это снижает стойкость одноразового кода и скрывает проблему синхронизации времени.

Подтвердите временной сдвиг

Сравните UTC-время на сервере, в контейнере и на устройстве в один момент.

  • Текущий код отклоняется, а предыдущий или следующий принимается.
  • Проблема возникла после переноса сервера или восстановления snapshot.
  • Коды не подходят только на одном экземпляре приложения.
  • После ручной корректировки часов вход временно работает.

Почему возникает проблема

TOTP использует Unix time, поэтому важен реальный момент, а не отображаемый часовой пояс.

  • NTP отключен, недоступен или служба синхронизации остановлена.
  • Виртуальная машина восстановлена со старым временем.
  • Один узел кластера имеет заметный drift.
  • Код ошибочно применяет локальный часовой пояс к Unix timestamp.
  • На телефоне отключена автоматическая установка времени.

Пошаговая диагностика

Не выводите TOTP secret в журнал при проверке.

  1. Сравните UTC на всех узлах и доверенном внешнем источнике.
  2. Проверьте состояние службы синхронизации и выбранные NTP-серверы.
  3. Определите величину drift по системным метрикам.
  4. Проверьте библиотеку TOTP, период и алгоритм.
  5. Сравните поведение текущего, предыдущего и следующего временного шага.

Не смешивайте часовой пояс и TOTP-время

Часовой пояс влияет на отображение даты, но TOTP должен вычисляться по абсолютному Unix time.

  • Сервер может отображать московское время при корректном UTC.
  • Контейнер и host используют один источник системных часов.
  • Летнее время не должно менять вычисление TOTP.
  • Время базы не используется вместо системного без необходимости.

Как исправить проблему

Сначала восстановите точное время, затем проверяйте учетную запись и секрет.

  1. Включите штатную синхронизацию времени на host.
  2. Разрешите доступ к надежным NTP-источникам.
  3. Исправьте drift на всех экземплярах приложения.
  4. Уберите повторное преобразование часового пояса в коде.
  5. Оставьте минимально необходимое допустимое окно TOTP.

Как проверить результат

  • Сдвиг часов находится в допустимых пределах.
  • Текущий код принимается на каждом узле.
  • Предыдущие коды быстро перестают действовать.
  • После reboot время синхронизируется автоматически.

Типичные ошибки

  • Перегенерировать секрет всем пользователям до проверки часов.
  • Принимать много соседних временных шагов.
  • Исправлять отображаемый timezone вместо системного drift.
  • Логировать секрет или полный QR-код.

Как предотвратить повторение

  • Мониторьте clock offset на всех серверах.
  • Проверяйте NTP после миграции и snapshot.
  • Добавьте резервные коды с безопасным хранением.
  • Тестируйте 2FA при deploy аутентификации.

Когда нужна помощь

Если правильные коды 2FA отклоняются, я проверю время host и контейнеров, NTP, реализацию TOTP и настройки окна, восстановлю вход без ослабления защиты.