Сброс пароля на Django с фронтальным пользовательским интерфейсом

Я работаю над проектом, который использует Django в качестве бэкэнда и next.js/react.js в качестве фронт-энда. Проблема, с которой я столкнулся, заключается в попытке сбросить пароль с помощью пользовательского интерфейса моего фронт-энда. Все решения, которые я нашел, предполагают создание пользовательского интерфейса на сервере бэкенда с помощью шаблонов, чего я бы предпочел не делать.

Мне удается получить следующее письмо от Django(dj_rest_auth), которое предоставляет ссылку с доменом сервера.

Hello from MyApp!

You're receiving this email because you or someone else has requested a password reset for your user account.
It can be safely ignored if you did not request a password reset. Click the link below to reset your password.

http://localhost:8000/password-reset-confirm/k/cd01t1-dfsdfdfwer2/

Я пытался переопределить PasswordResetSerializer таким образом, но это не работает.

from dj_rest_auth.serializers import PasswordResetSerializer

class MyPasswordResetSerializer(PasswordResetSerializer):

    def get_email_options(self) :
      
        return {
            'email_template_name': 'http://localhost:3000/new-password'
        }

urls.py

    path('password-reset/', PasswordResetView.as_view()),
    path('password-reset-confirm/<uidb64>/<token>/',
         PasswordResetConfirmView.as_view(), name='password_reset_confirm'),  

А в моем файле settings.py у меня есть

...
REST_AUTH_SERIALIZERS = {
    'PASSWORD_RESET_SERIALIZER': 'myapp.serializers.MyPasswordResetSerializer'
}
...

Как изменить ссылку в письме о сбросе пароля на ту, которая отправляет пользователя в клиент для создания нового пароля?

Он должен быть реализован через шаблон Django.

from django.contrib.auth.forms import PasswordResetForm
from dj_rest_auth.serializers import PasswordResetSerializer
from django.conf import settings

class MyPasswordResetSerializer(PasswordResetSerializer):
    password_reset_form_class = PasswordResetForm

    def get_email_options(self):
        return {
            "subject_template_name": "email/password_reset_subject.txt",
            "email_template_name": "email/password_reset_message.html",
            "html_email_template_name": "email/password_reset_message.html",
            "extra_email_context": {
                "settings": settings,
            }
        }

Вышеуказанные пути связаны через шаблон Django.

В среде, которую я тестировал, я реализовал его в приложении authenticate, поэтому он подключается к файлу authenticate/template/email/password_reset_message.html.

password_reset_subject.txt

password change

password_reset_message.html

<html>
  <body>
    <h1>hello</h1>
  </body>
</html>

Вот результат тестирования с помощью приведенного выше шаблона. enter image description here enter image description here

Единственное решение, которое я нашел на данный момент, - это использование сторонней библиотеки под названием Djoser. Вот настройки, которые потребовались, чтобы все заработало.

settings.py

DOMAIN = 'localhost:3000'
SITE_NAME = 'localhost'

DJOSER = {
    'PASSWORD_RESET_CONFIRM_URL': 'password/reset/{uid}/{token}',
    'USERNAME_RESET_CONFIRM_URL': 'username/reset/{uid}/{token}',
    'PASSWORD_RESET_CONFIRM_RETYPE': True,
    'ACTIVATION_URL': 'activate/{uid}/{token}',
    'SEND_ACTIVATION_EMAIL': True,
    'SERIALIZERS': {},
}

urls.py

urlpatterns = [
  ...
  path('auth/', include('djoser.urls')),
  ...
]

Теперь я отправляю электронное письмо пользователя на адрес http://localhost:8000/auth/users/reset_password/, и пользователь получает следующее письмо.

Вы получаете это письмо, потому что запросили сброс пароля для вашей учетной записи пользователя на localhost.

Пожалуйста, перейдите на следующую страницу и выберите новый пароль:

http://localhost:3000/password/reset/UWA/cd0m9t-dfwwe323g

Отсюда вы можете получить параметры из URL, как обычно на клиенте, и отправить новый пароль в конечную точку /users/reset_password_confirm/.

Вот ссылка для получения дополнительной информации об их конечных точках.

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