Как аутентифицировать пользователя django в моей пользовательской системе сброса пароля?
Я строю систему сброса пароля для своих пользователей. Код сброса пароля отправляется на почту пользователя и теперь я хочу аутентифицировать пользователя по этому коду. Если пользователь введет правильный код, то пароль будет изменен, иначе нет.
Я также храню код проверки в полях моей модели.
models.py:
class UserProfile(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,related_name="userprofile")
forget_password_token = models.CharField(max_length=100,blank=True,null=True)
views.py Я отправляю код на почту пользователя, а также храню тот же код в полях моей модели
def ForgetPasswordSendCode(request):
if request.method == "POST":
email = request.POST["email"]
User = get_user_model()
if not User.objects.filter(email=email).first():
messages.success(request, "Invalid mail")
return redirect('members:reset-password')
user_obj = User.objects.get(email=email)
reset_code = str(rand_number_mail()) #generating random code
profile_obj = UserProfile.objects.get(user=user_obj)
profile_obj.forget_password_token = reset_code
profile_obj.save()
current_site = get_current_site(request)
subject = 'Verification Code'
context = {
'user_first_name': user_obj.first_name ,
'user_last_name': user_obj.last_name ,
'domain': current_site.domain,
'reset_code': reset_code
}
html_body = render_to_string('mail/resetpassword-mail.html', context)
to_email = request.POST["email"]
email = EmailMultiAlternatives(subject=subject,from_email='noreply@farhyn.com',to=[to_email])
email.attach_alternative(html_body, "text/html")
email.send(fail_silently=False)
messages.success(request, "An password reset code sent to your email")
return redirect('members:change-password') #redirecting user to password reset page after submitting mail.
return render(request, 'members/password_reset_form.html')
Теперь я застрял на представлении сброса пароля, где пользователь вставляет код и меняет свой пароль. Я не понимаю, как аутентифицировать пользователя по проверочному коду.
def ChangePassWordPage(request):
return render(request,'members/password_change.html')
Это может помочь
Шаг 1: Отправьте пользователю свой код, в коде должна быть ссылка на пользователя, чтобы его было легко перепроверить
Шаг 2: если ваш код совпадает с кодом пользователя (в данном случае действует как аутентификация)
Шаг 3: обновить модель пользователя с новым паролем (make_password)
UPDATE
def ChangePassWordPage(request):
if request.method == "POST":
email = request.POST["email"]
user_token = request.POST["token"]
User = get_user_model()
if not User.objects.filter(email=email).first():
messages.success(request, "Invalid mail")
return redirect('members:reset-password')
user_obj = User.objects.get(email=email)
token = UserProfile.objects.filter(user = user_obj).first().forget_password_token
if token == user_token:
#update your user password
else:
return redirect('members:reset-password')
return render(request,'members/password_change.html')
На шаге 2 ваш токен будет действовать как средство аутентификации, токен просто проверит соответствие пользователя и токена, и если они совпадают, то вы просто обновите пароль. Это позволит вам обновить пароль
Да Так же как и сейчас!!!
You don't authenticate the user by the verification code. You get the matching user object by the code and chance the password. –
Klaus D.