Реализация безопасной двухфакторной аутентификации для страницы входа в систему с помощью мастера форм Django

поэтому в основном я хочу достичь чего-то похожего на реализацию двухфакторной аутентификации Google. Моя форма входа в систему состоит из 2-шаг мастера форм:

  1. Шаг 1 (проверка имени пользователя и пароля)
  2. Шаг 2 (аутентификация маркера безопасности)

сценарии использования будут:

  1. пользователь имеет маркер безопасности, связанный с его учетной записью: входит в систему, если пользователь проходит Шаг 1 и шаг 2
  2. пользователь не имеет маркера безопасности: регистрирует пользователя сразу после того, как он проходит Шаг 1 только

теперь я подкласс мастера форм django, который будет использоваться в качестве моего входа в систему. На Шаге 2 по умолчанию Django FormWizard будет включать значения полей из ранее представленных форм в качестве скрытых полей. Но, как вы знаете, пароль вводится на Шаге 1, поэтому я не хочу включать его в Шаг 2 по соображениям безопасности.

моей первой мыслью было бы использовать сессии, чтобы указать, если пользователь прошел Шаг 1, поэтому мне не нужно включать значения полей из Шага 1.. но, возможно, я что-то упускаю из виду. Какие более безопасные решения для этого?

также я не совсем понимаю использование security-hash в FormWizard. Кто-нибудь может объяснить?

Спасибо большое.

5 ответов


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

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


более года после последнего ответа:

Django-двухфакторный-auth строит на django-otp и добавляет из коробки поддержку Google Authenticator, Twilio SMS, резервные коды. Очень внушительный.


Duo безопасности duo_web есть С открытым исходным кодом Django demo, который покажет вам один из способов сделать это (я разработчик дуэт).

демонстрационная установка имеет декоратор @duo_auth_requried, подобный встроенному @login_required, который проверяет файл cookie сеанса, указывающий, что пользователь прошел аутентификацию 2-го фактора. Декоратор @login_required проверяет локальную аутентификацию, декоратор @duo_auth_required проверяет 2-й фактор аутентификация и отсутствие либо перенаправляет пользователя в соответствующую форму.

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


на django-otp проект добавляет подключаемую двухфакторную аутентификацию в Django. Его можно интегрировать на различных уровнях, от взгляда для того чтобы сформировать к низкоуровневому API.


вы можете использовать существующий многофакторный сервер аутентификации, такой как LinOTP или privacyidea. Я создал django-плагин рецензии.