Пароль Сброс Активация Ссылка - PullRequest
0 голосов
/ 05 ноября 2019

У меня 2 просмотра. 1) Для регистрации пользователя. 2) Для сброса пароля. Активация Ссылка для обеих задач генерируется и отправляется на почту. Моя ссылка для активации при первой регистрации работает нормально. Когда я создаю ссылку активации для сброса пароля, срок его действия не истекает после использования.

@csrf_protect
def changing_password_confirmation(request, uidb64, token):
    try:
        uid = force_bytes(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None
    if user is not None and passord_reset_token.check_token(user, token):
        print('user is not None and passord_reset_token.check_token(user, token)')
        if request.method == 'POST':
            password1 = request.POST.get('password1')
            password2 = request.POST.get('password2')
            if password1 == password2:
                user.set_password(password1)
                user.save()
                return render(request=request, template_name='website/password_reset_complete.html')
            else:
                return HttpResponse('<h1>Password doesnt match</h1>')
        return render(request=request, template_name='website/password_reset_confirm.html')
    else:
        print('User', user)
        result = 'Activation link is invalid!'
        return render(request=request, template_name='website/password_reset_confirm.html', context={'result': result})
from django.contrib.auth.tokens import PasswordResetTokenGenerator
from django.utils import six


class TokenGenerator(PasswordResetTokenGenerator):
    def _make_hash_value(self, user, timestamp):
        return (
                six.text_type(user.pk) + six.text_type(timestamp) +
                six.text_type(user.is_active)
        )


class PasswordTokenGenerator(PasswordResetTokenGenerator):
    def _make_hash_value(self, user, timestamp):
        return (
                six.text_type(user.pk) + six.text_type(timestamp) +
                six.text_type(user.is_active)
        )
account_activation_token = TokenGenerator()
passord_reset_token = PasswordTokenGenerator()

Сброс шаблона пароля

{% extends "website/header.html" %}

{% block title %}Enter new password{% endblock %}

{% block content %}

{% if validlink %}
<h1>Set a new password!</h1>
<form method="POST">
    {% csrf_token %}
    <div class="form-group">
        Password: <input type="text" class="form-control" name='password1' placeholder="password" value=""/>
    </div>
    <div class="form-group">
        Repeat Password: <input type="text" class="form-control" name='password2' placeholder="confirm" value=""/>
    </div>
    <input type="submit" value="Change my password">
</form>

{% else %}
{{ result }}
{% endif %}

{% endblock %}```

1 Ответ

1 голос
/ 05 ноября 2019

Во-первых, Django поставляется с представлениями для сброса паролей . Я предлагаю вам использовать их, а не писать свои собственные.

Ваш хэш зависит только от поля пользователя pk и is_active, и они не изменяются после сброса пользователем пароля.

    return (
            six.text_type(user.pk) + six.text_type(timestamp) +
            six.text_type(user.is_active)
    )

Django решает проблему , включая password и last_login пользователя в хеш, так что он изменяется после сброса пароля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...