Проверка личности по SMS/почте | Django
Пожалуйста, помогите мне с выбором решения для реализации проверки личности с использованием одноразового токена с ограниченным временем жизни.
Под верификацией личности я подразумеваю необходимость отправки токена/кода пользователю по номеру телефона или электронной почте. Например, для сброса пароля.
Меня интересует решение, которое лучше всего подходит для использования в современном веб-приложении. Пожалуйста, расскажите мне, основываясь на вашем опыте разработки подобных систем.
Решения, которые у меня на уме:
- 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.
- 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()
Пожалуйста, опишите свой ответ подробно. У меня нет опыта в этом вопросе, и я прошу Вас проще отнестись к недостаткам моего вопроса. Извините, это связано с моим невежеством.