Сброс пароля 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:

rest_reset_password

Однако, эта страница не предназначена для того, чтобы быть открытой для пользователя. Поэтому мой следующий вопрос на S.O. следующий: Как создать пользовательскую страницу для сброса пароля?

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