密码重置 django-allauth 和 django-rest-auth

Password reset django-allauth and 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'),
]

现在使用 { "email": "test1@test.com" } 的 JSON 有效负载发布到 http://127.0.0.1:8000/password/reset/ 会出现错误: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 以便我可以执行休息请求以发送包含有效 URL 的电子邮件,用户可以使用它来更改 his/her 密码?

更新: 我刚刚看到 django-allauth 不再维护,您应该切换到:dj-rest-auth。现在这个过程重新开始...

好的,下面的作品,post供参考,因为我在这上面浪费了很多时间。

Pip文件:

[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'),
]

我能够 post 到: http://127.0.0.1:8000/user/password/reset/ JSON 有效载荷 { "email": "test1@test.com" }.

通过重置 URL 生成电子邮件,单击此 URL 会将用户带到 Django 的可浏览 API 页面:

但是,此页面无意向用户公开。所以我的下一个问题是 S.O。是:How to create a custom page for the user to reset his/her password?