Как аутентифицировать пользователя 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.

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