Как реализовать систему верификации? Django
Задача - реализовать систему верификации для следующих действий: регистрация, сброс пароля, изменение адреса электронной почты, изменение номера телефона.
Что я подразумеваю под этой задачей?
Необходимо сгенерировать токены и затем отправить их на адрес электронной почты или номер телефона пользователя. После их использования пользователь будет верифицирован.
Для себя я определил кучу вариантов, но не знаю, какой из них выбрать.
- Generate the same type of token for SMS and email. This token is a code, six-digit, for example. Store them in redis, where the key is the user id and the value is the token itself. When the code comes from the client, search for it in redis. If it does not exist, then it is possible that it expired, or it did not exist at all.
- Store codes in the Django model, delete expired ones on access and make a management command so that we can delete those that have not been accessed.
- Generate only digital codes for SMS, and character tokens for email.
Возможно, что среди перечисленных вариантов вообще нет лучшего. Пожалуйста, расскажите мне о лучших практиках.
Меня интересует, какой метод будет более удобен для клиента и со стороны разработки лучше всего реализован.
В заключение хочу сказать, что я пробовал django-phone-verify отправлять коды по SMS, но я не понимаю, зачем нужно создавать токен сессии устройства, жестко привязываясь к одному устройству.
Для регистрации я часто делаю так:
from django.contrib.sites.shortcuts import get_current_site
from django.template.loader import render_to_string
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.utils.encoding import force_bytes
from django.contrib.auth.tokens import default_token_generator
from django.core.mail import EmailMessage
# views.py
class RegistrationView(View):
def post(self, request):
# do the form stuff
....
# here it comes!
current_site = get_current_site(request)
mail_subject = 'Test Subject'
message = render_to_string("some_email.html", {
"user": user,
"domain": current_site,
"uid": urlsafe_base64_encode(force_bytes(user.pk)),
"token": default_token_generator.make_token(user),
})
to_email = "somebody@a.com"
send_email = EmailMessage(mail_subject, message, to=[to_email])
send_email.send()
class ValidationView(View):
def get(self, request, uidb64, token):
try:
uid = urlsafe_base64_decode(uidb64).decode()
user = User._default_manager.get(pk=uid)
except(TypeError, ValueError, OverflowError, Account.DoesNotExist):
user = None
if user is not None and default_token_generator.check_token(user, token):
user.is_active = True
user.save()
return redirect("maybe login")
else:
return redirect("register")