Vuejs + django passwordreset email и перенаправление на vue front end
Я пытаюсь реализовать сброс пароля, отправляя электронное письмо пользователям, используя Django в бэкенде и vue во фронтенде (оба работают на разных IP-адресах). Я пытался использовать пакет django-rest-passwordreset и шаги, предоставленные (Django REST-Auth Password Reset и https://newbedev.com/django-rest-auth-password-reset). Непонятно, что такое vuedj.constant и как они импортируют site_url, site_full_name, site_shortcut_name из vuedj.constants. Я даже пробовал использовать пользовательские ResetPasswordEmailRequestSerializer и SetNewPasswordSerializer Я могу получить email с их помощью, но не могу перенаправить на frontend или получить uidb64 и токен для конкретного пользователя во frontend.
serializers.py
from django.contrib.auth.tokens import PasswordResetTokenGenerator
from rest_framework.exceptions import AuthenticationFailed
from django.utils.encoding import force_str
from django.utils.http import urlsafe_base64_decode
class ResetPasswordEmailRequestSerializer(serializers.Serializer):
email = serializers.EmailField(min_length=2)
redirect_url = serializers.CharField(max_length=500, required=False)
class Meta:
fields = ['email']
class SetNewPasswordSerializer(serializers.Serializer):
password = serializers.CharField(
min_length=6, max_length=68, write_only=True)
token = serializers.CharField(
min_length=1, write_only=True)
uidb64 = serializers.CharField(
min_length=1, write_only=True)
class Meta:
fields = ['password', 'token', 'uidb64']
def validate(self, attrs):
try:
password = attrs.get('password')
token = attrs.get('token')
uidb64 = attrs.get('uidb64')
id = force_str(urlsafe_base64_decode(uidb64))
user = User.objects.get(id=id)
if not PasswordResetTokenGenerator().check_token(user, token):
raise AuthenticationFailed('The reset link is invalid', 401)
user.set_password(password)
user.save()
return (user)
except Exception as e:
raise AuthenticationFailed('The reset link is invalid', 401)
return super().validate(attrs)
view.py
from django.contrib.auth.tokens import PasswordResetTokenGenerator
from django.utils.encoding import smart_bytes, smart_str, force_str, DjangoUnicodeDecodeError
from django.utils.http import urlsafe_base64_decode,urlsafe_base64_encode
from django.contrib.sites.shortcuts import get_current_site
from django.urls import reverse
from .utils import Util
class RequestPasswordResetEmail(generics.GenericAPIView):
serializer_class = ResetPasswordEmailRequestSerializer
def post(self, request):
serializer = self.serializer_class(data=request.data)
email = request.data.get('email', '')
print(email)
if User.objects.filter(email=email).exists():
user = User.objects.get(email=email)
uidb64 = urlsafe_base64_encode(smart_bytes(user.id))
token = PasswordResetTokenGenerator().make_token(user)
current_site = get_current_site(
request=request).domain
relativeLink = reverse(
'password-reset-confirm', kwargs={'uidb64': uidb64, 'token': token})
redirect_url = request.data.get('redirect_url', '')
absurl = 'http://'+current_site + relativeLink
email_body = 'Hello, \n Use link below to reset your password \n' + \
absurl+"?redirect_url="+redirect_url
data = {'email_body': email_body, 'to_email': user.email,
'email_subject': 'Reset your passsword'}
Util.send_email(data)
return Response({'success': 'We have sent you a link to reset your password'}, status=status.HTTP_200_OK)
class PasswordTokenCheckAPI(generics.GenericAPIView):
serializer_class = SetNewPasswordSerializer
def get(self, request, uidb64, token):
redirect_url = request.GET.get('redirect_url')
try:
id = smart_str(urlsafe_base64_decode(uidb64))
user = User.objects.get(id=id)
if not PasswordResetTokenGenerator().check_token(user, token):
return Response({'error':'Token is not valid, please request a new one'})
return Response({'success': True, 'message':'Credentials Valid', 'uidb64': uidb64, 'token' : token},status=status.HTTP_200_OK)
except DjangoUnicodeDecodeError as identifier:
if not PasswordResetTokenGenerator().check_token(user):
return Response({'error':'Token is not valid, please request a new one'})
class SetNewPasswordAPIView(generics.GenericAPIView):
serializer_class = SetNewPasswordSerializer
def patch(self, request):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
return Response({'success': True, 'message': 'Password reset success'}, status=status.HTTP_200_OK)
urls.py
path('request-reset-email/', RequestPasswordResetEmail.as_view(),
name="request-reset-email"),
path('password-reset/<uidb64>/<token>/',
PasswordTokenCheckAPI.as_view(), name='password-reset-confirm'),
path('password-reset-complete/',
SetNewPasswordAPIView.as_view(), name='password-reset-complete'),
ссылка на почту, которую я получаю
http://127.0.0.1:8000/password-reset/NQ/at3bqh-4de4b8462a43ee6cc2913ea2fe37acab/
Пожалуйста, помогите мне, используя мой существующий код или пакет django-rest-passwordreset, как я могу добиться перенаправления на front end и получить uidb64 и токен и сбросить пароль по ссылке.