Сброс пароля django-allauth и django-rest-auth
Я не могу разобраться с этой проблемой. Прочитал много решений, но не могу найти правильную комбинацию, которая работает для меня.
Я хочу инициировать поток сброса пароля пользователя из моего приложения (android/iOS).
Я думаю, что мне нужно django-rest-auth для этого выставить конечную точку API примерно так:
from rest_auth.views import PasswordResetView
urlpatterns = [
path('password/reset/', PasswordResetView.as_view(), name='rest_password_reset'),
]
Теперь при постинге в http://127.0.0.1:8000/password/reset/ с полезной нагрузкой JSON { "email": "test1@test.com" } возникает ошибка: django.urls.exceptions.NoReverseMatch: Reverse for 'password_reset_confirm' not found.
Теперь я затрудняюсь со следующей частью. Я обнаружил, что password_reset_confirm определен в django.contrib.auth, но я не хочу раскрывать интерфейс admin-like пользователю.
Я хотел бы использовать allauth PasswordResetFromKeyView.
Итак, определяя password_reset_confirm как:
path('password/reset/<uidb64>/<token>/',
PasswordResetFromKeyView.as_view(),
name='password_reset_confirm'
),
Работает. Отправляется письмо, содержащее URL-адрес сброса. Но теперь, следуя этому URL, я получаю другую ошибку: PasswordResetFromKeyView.dispatch() missing 2 required positional arguments: 'uidb36' and 'key'
Ок, очевидно, изменил аргументы пути password_reset_confirm с <uidb64> и <token> на <uidb36> и <key>.
Затем ошибка переходит на password_reset_email.html из-за аргументов в
{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
Хорошо, также изменил это на uidb32=uid and key=token приводит к HTML странице, отображающей "BAD TOKEN".
Теперь я в полной растерянности. Как настроить django-allauth и django-rest-auth так, чтобы я мог сделать rest-запрос для отправки электронной почты, содержащей действительный URL, который пользователь может использовать для изменения своего пароля?
UPDATE: Я только что увидел, что django-allauth больше не поддерживается и что вам следует перейти на dj-rest-auth. Теперь процесс начинается заново...
Ок, следующее работает, размещаю для справки, потому что я потерял ужасно много времени на это.
Pipfile:
[packages]
django = "~=3.0"
django-allauth = "0.50.0"
django-rest-auth = "0.9.5"
urls.py:
from django.contrib import admin
from django.urls import path, re_path
# Register
from allauth.account.views import ConfirmEmailView
from rest_auth.registration.views import RegisterView, VerifyEmailView
# Password reset
from rest_auth.views import PasswordResetView, PasswordResetConfirmView
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r'^confirm-email/(?P<key>[-:\w]+)/$',
ConfirmEmailView.as_view(), name='account_confirm_email'),
path('user/register/',
RegisterView.as_view(),
name='rest_register'
),
path('user/verify-email/',
VerifyEmailView.as_view(),
name='rest_verify_email'
),
# Password reset
path('user/password/reset/',
PasswordResetView.as_view(),
name='rest_password_reset'
),
path('user/password/reset/confirm/<uidb64>/<token>/',
PasswordResetConfirmView.as_view(),
name='password_reset_confirm'),
]
Я могу отправить сообщение в: http://127.0.0.1:8000/user/password/reset/ с полезной нагрузкой JSON { "email": "test1@test.com" }.
Создается электронное письмо с URL-адресом сброса, нажатие на который приводит пользователя на просматриваемую страницу API Django:
Однако, эта страница не предназначена для того, чтобы быть открытой для пользователя. Поэтому мой следующий вопрос на S.O. следующий: Как создать пользовательскую страницу для сброса пароля?
