Проверка личности по SMS/почте | Django

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

Под верификацией личности я подразумеваю необходимость отправки токена/кода пользователю по номеру телефона или электронной почте. Например, для сброса пароля.

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

Решения, которые у меня на уме:

  1. Use redis as storage. In case of working with email, generate a token and save it in redis, where the key - user's email address. In the case of working with SMS, create a code and save it in redis, where the key - user's phone number. Possible disadvantage: since redis is designed to work with a key-value pair, it is impossible to have two tokens/codes at once. (meaning that they will have different purposes). It is possible that this is not necessary at all.
  2. Use the Django object model as storage. Something like this:
class TokenManager(models.Manager):
   # Some util-methods.
   # ...

   def delete_expired(self):
       expires = models.ExpressionWrapper(
           models.F("created_at") + models.F("lifetime"),
           models.DateTimeField()
       )
       self.annotate(expires_at=expires).filter(expires_at__lte=now()).delete()


class Token(models.Model):
   # Roughly speaking, token identifier. Examples: "password-reset", "registration-confirmation"
   purpose = models.CharField(max_length=40, db_index=True)
  
   # This field must contain any value represents the token.
   # For example, for verification via SMS, six-digits numeric codes used.
   # For verification via email can be used uuid4().hex
   value = models.TextField(db_index=True)
   user = models.ForeignKey(User, models.CASCADE, "tokens", db_index=True)

   created_at = models.DateTimeField(auto_now_add=True)
   lifetime = models.DurationField(default=settings.DEFAULT_TOKEN_LIFETIME)

   objects = TokenManager()

Пожалуйста, опишите свой ответ подробно. У меня нет опыта в этом вопросе, и я прошу Вас проще отнестись к недостаткам моего вопроса. Извините, это связано с моим невежеством.

Вернуться на верх