Django 2FA работает локально, но не работает (тихо) на сервере

Проблема

Мне нужно реализовать двухфакторную аутентификацию для проекта Django. Я использую двухфакторную аутентификацию Django, которая отлично работает локально как с Google Authenticator, так и с нашим SMS-шлюзом. Проблема возникает, когда я публикую приложение на тестовом сервере. Логин работает как обычно, но когда я заполняю токен, он просто перенаправляет меня обратно к начальному шагу входа в систему, чтобы снова ввести свои учетные данные. Он не выдает никаких сообщений об ошибках в пользовательском интерфейсе и, насколько я вижу, в журналах тоже.

Не знаю, актуально ли это, но приложение работает как служба Docker Swarm на сервере.

Что я пробовал

Из-за отсутствия обратной связи и знания библиотеки 2FA, а также библиотеки OTP, я действительно не знаю, с чего начать. Я почти уверен, что настройки на моем локальном компьютере и в тестовой среде практически идентичны. Версии пакетов одинаковы. Я даже убедился, что время и часовые пояса на моей машине и на сервере совпадают.

Глядя в базу данных в таблицах для библиотеки OTP, счетчик отказов равен 0 и увеличивается каждый раз, когда я пытаюсь войти в систему. Это говорит мне, что сам токен проверен в соответствии с документацией Django-OTP:

BigIntegerField: временной шаг последнего проверенного токена. Чтобы избежать повторной проверки одного и того же токена, он будет обновляться при каждой успешной проверке. Впоследствии будут проверяться только токены с более высоким временным шагом. (По умолчанию: -1)


Любые предложения очень ценятся. Я знаю, что не предоставил много конкретных деталей моей точной реализации, но надеюсь, что кто-то может иметь какое-то общее представление о том, в чем может быть проблема. В любом случае дайте мне знать, если вам нужно что-то более конкретное.

Спасибо,

никное

Редактировать 1

Я ошибался, на самом деле в журналах было что-то, чего я раньше не видел:

      Requested step 'token' is no longer valid, returning to last valid step in the wizard.

Так, может быть, это может указывать на то, что у меня есть дрейф, из-за которого токен недействителен?

Версии

  • Django 2.2.20
  • django-otp 1.0.3
  • Джанго-двухфакторная аутентификация 1.13.1

Я постараюсь включить соответствующий код

Мой settings.py разделен на настройки среды, каждый из которых settings.base.py. Весь соответствующий код для 2FA находится в settings.base.py:

      ISTALLED_APPS = [
    ...
    'django_otp',
    'django_otp.plugins.otp_static',
    'django_otp.plugins.otp_totp',
    'two_factor'
]

MIDDLEWARE = [
    ...
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django_otp.middleware.OTPMiddleware',
    ...
]

LOGIN_URL = 'two_factor:login'

# Not sure if these are relevant
TIME_ZONE = 'Europe/Oslo'

USE_I18N = True

USE_L10N = True

USE_TZ = True

Это практически все, что я добавил, чтобы он работал локально на моей машине.

1 ответ

Обнаружение строки журнала в моем обновлении дало мне кое-что для Google, и я нашел это: https://github.com/Bouke/django-two-factor-auth/issues/65#issuecomment-57931565

Итак, что происходит, браузер запрашивает favicon.ico, который не был указан в моих URL-адресах, освобожденных от входа, поэтому запрос был перенаправлен на страницу входа, что сделало недействительным первоначальный вход в систему, который был на фактическом экране.

Понятия не имею, почему этого не произошло локально, но, вероятно, что-то с сервером разработки ... В любом случае, теперь он работает!

Другие вопросы по тегам