Python Django REST验证密码重置

Python Django REST验证密码重置,python,django,django-rest-framework,django-allauth,django-rest-auth,Python,Django,Django Rest Framework,Django Allauth,Django Rest Auth,我完全被可用的django中间件搞糊涂了: 我只想通过在后端使用django和rest\u auth以及在前端使用Vue来运行密码重置(以及稍后的密码更改)功能 步骤1:通过邮件请求重置链接 意见 到目前为止,我已经制作了一个CustomPasswordResetView: #项目/accounts/views.py 从rest_auth.views导入密码ResetView 类CustomPasswordResetView(PasswordResetView): 通过 串行器 和自定义密码重

我完全被可用的django中间件搞糊涂了:

我只想通过在后端使用
django
rest\u auth
以及在前端使用Vue来运行密码重置(以及稍后的密码更改)功能

步骤1:通过邮件请求重置链接 意见 到目前为止,我已经制作了一个
CustomPasswordResetView

#项目/accounts/views.py
从rest_auth.views导入密码ResetView
类CustomPasswordResetView(PasswordResetView):
通过
串行器 和
自定义密码重置序列化程序

#project/accounts/serializers.py
从rest_auth.serializer导入密码ResetSerializer
类CustomPasswordResetSerializer(PasswordResetSerializer):
email=serializers.EmailField()
密码\u重置\u表单\u类=重置密码表单
def验证_电子邮件(自我、价值):
#使用序列化程序创建PasswordResetForm
self.reset\u form=self.password\u reset\u form\u类(数据=self.initial\u数据)
如果不是self.reset\u form.is\u valid():
引发序列化程序.ValidationError(self.reset\u form.errors)
######筛选您的用户模型######
如果未获取用户模型().objects.filter(电子邮件=值).exists():
raise序列化程序。ValidationError(389;(“无效电子邮件地址”))
返回值
def保存(自我):
request=self.context.get('request')
#设置一些值以触发发送电子邮件方法。
选项={
'use_https':request.is_secure(),
“来自电子邮件”:getattr(设置,“默认来自电子邮件”),
“请求”:请求,
}
opts.update(self.get\u email\u options())
自复位表单保存(**选项)
设置.py 在
settings.py
中,我有以下字段,这些字段似乎与我的问题相关:

#项目/vuedj/settings.py
REST\u AUTH\u序列化程序={
“用户详细信息序列化程序”:“accounts.SERIALIZER.CustomUserDetailsSerializer”,
“登录\序列化程序”:“accounts.serializers.CustomUserLoginSerializer”,
“密码\u重置\u序列化程序”:“accounts.serializers.CustomPasswordResetSerializer”
}
(完整的
settings.py
附在底部)

URL模式 我的URL已捕获我的API请求,以便发送密码重置电子邮件:

#项目/vuedj/url.py
URL模式=[
路径('admin/',admin.site.url),
路径('api/v1/',include('api.url')),
路径('accounts/',include('allauth.url')),
路径(“”,api_views.index,name='home')
]
#项目/api/url.py
URL模式=[
路径('auth/',include('accounts.url')),
#其他路径。。。
]
#项目/accounts/url.py
URL模式=[
路径(“”,acc_views.UserListView.as_view(),name='user-list'),
路径('login/',acc_views.UserLoginView.as_view(),name='login'),
路径('logout/',acc_views.UserLogoutView.as_view(),name='logout'),
路径('register/',acc_views.CustomRegisterView.as_view(),name='register'),
路径('reset-password/',acc_view.CustomPasswordResetView.as_view(),name='reset-password'),
路径('reset-password-confirm/',acc_-views.CustomPasswordResetConfirmView.as_-view(),name='reset-password-confirm'),
路径('/',acc_views.UserDetailView.as_view(),name='user-detail')
]
带有PW重置令牌生成器的电子邮件 CustomPasswordReset视图最终将生成一封带有精美pw reset链接的精美电子邮件。链接是有效的,当我点击它时,我可以通过allauth模板完全重置密码

rest auth(间接)使用此代码生成重置令牌:

#project/.venv/Lib/site packages/allauth/account/forms.py
def保存(自我、请求、**kwargs):
当前站点=获取当前站点(请求)
电子邮件=自我清理的数据[“电子邮件”]
令牌\u生成器=kwargs.get(“令牌\u生成器”,
默认\u令牌\u生成器)
对于self.users中的用户:
临时密钥=令牌生成器。生成令牌(用户)
#将其保存到密码重置模型
#密码重置=密码重置(用户=用户,临时密钥=临时密钥)
#密码_reset.save()
#发送密码重置电子邮件
path=reverse(“帐户\重置\密码\来自\密钥”,
kwargs=dict(uidb36=user\u pk\u to\u url\u str(user),
键=温度(键)
url=构建\绝对\ uri(
请求、路径)
上下文={“当前_站点”:当前_站点,
“用户”:用户,
“密码重置url”:url,
“请求”:请求}
如果应用程序\设置.身份验证\方法\
!= AuthenticationMethod.EMAIL:
上下文['username']=用户\用户名(用户)
获取\u适配器(请求)。发送\u邮件(
“帐户/电子邮件/密码\u重置\u密钥”,
电子邮件,
(上下文)
返回自清理的_数据[“电子邮件”]
密码ResetTokenGenerator
用于上述代码:

#project/.venv/Lib/site packages/django/contrib/auth/tokens.py
类PasswordResetTokenGenerator:
"""
用于生成和检查密码令牌的策略对象
复位机构。
"""
key_salt=“django.contrib.auth.tokens.PasswordResetTokenGenerator”
secret=settings.secret\u密钥
def make_令牌(自身、用户):
"""
返回一个令牌,该令牌可用于一次密码重置
对于给定的用户。
"""
返回self.\u生成带有时间戳(user,self.\u num\u days(self.\u today())的令牌\u)
def check_令牌(自身、用户、令牌):
"""
检查给定用户的密码重置令牌是否正确。
"""
如果不是(用户和令牌):
返回错误
#解析令牌
尝试:
ts_b36,hash=token.split(“-”)
http://localhost:8000/accounts/password/reset/key/16-52h-42b222e6dc30690b2e91/
from django.views.generic import TemplateView

PASSWORD_RESET = (
    r'^auth/password-reset-confirmation/'
    r'(?P<uidb64>[0-9A-Za-z_\-]+)/'
    r'(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})$'
)

urlpatterns += [
    re_path(
        PASSWORD_RESET,
        TemplateView.as_view(),
        name='password_reset_confirm',
    ),
]
path(
    'reset-password-confirm/',
    acc_views.CustomPasswordResetConfirmView.as_view(),
    name='reset-password-confirm'
),
Click the link below to reset your password.

localhost:8000/password-reset/4873759c229f17a94546a63eb7c3d482e73983495fa40c7ec2a3d9ca1adcf017