Django Rest Framework и django rest framework simplejwt двухфакторная аутентификация

Я использую django версии 3.2.4 в сочетании с Django Rest Framework. Я также использую https://github.com/jazzband/djangorestframework-simplejwt для JWT.

Проблема: мне нужно включить двухфакторную аутентификацию следующим образом.

  1. Пользователь использует конечную точку, в которую он отправляет свое имя пользователя и пароль. Он получает обратно токен jwt, который включает в заявку проверочный код, необходимый для ввода хеш-кода. При этом на его электронную почту приходит письмо с этим кодом.
  2. Как только пользователь получает электронное письмо, которое он публикует в другом enpoint, полученный проверочный код и токен jwt он получил на предыдущем шаге.
  3. Если код, отправленный пользователем, совпадает с хешированным, он получает токен jwt, который будет использоваться в последующих запросах.

PS Приветствуются любые другие идеи, которые достигают чего-то подобного с вышеизложенным.

1 ответ

Я бы подошел к этому, добавив поле confirm_code к модели пользователя и обработав вход в систему, используя одно представление с двумя случаями:

  • 1-й случай, у меня есть имя пользователя и пароль в запросе, но нет кода, после проверки имени пользователя и пароля я бы создал вручную и вернул кратковременный токен доступа только без токена обновления (который истекает, например, через 3 минуты), я бы создал код подтверждения, сохраните его в db и отправьте по почте или sms и т. д.

  • 2-й случай, когда пользователь отправляет полученный код подтверждения, используя токен доступа в запросе, но без имени пользователя и пароля, таким образом я был бы уверен, что у пользователя есть доступный токен доступа и код подтверждения, я бы затем вернул токен доступа и обновил токен как обычно, на этом этапе я бы занес токен доступа в черный список после подтверждения входа в систему.