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

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

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

Сценарии использования:

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

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

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

Также я не совсем понимаю, как использовать хэш-безопасность в FormWizard. Может кто-нибудь объяснить?

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

Ответы [ 5 ]

5 голосов
/ 17 июля 2014

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

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

5 голосов
/ 23 апреля 2011

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

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

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

3 голосов
/ 24 февраля 2011

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

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

2 голосов
/ 11 марта 2013

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

0 голосов
/ 18 июля 2014

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

...