Сброс пароля на 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>
Вот результат тестирования с помощью приведенного выше шаблона.
Единственное решение, которое я нашел на данный момент, - это использование сторонней библиотеки под названием 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/
.
Вот ссылка для получения дополнительной информации об их конечных точках.