Drf令牌认证密码重置

Posted

技术标签:

【中文标题】Drf令牌认证密码重置【英文标题】:Drf token authentication password reset 【发布时间】:2021-08-28 15:36:12 【问题描述】:

我想知道 Django REST 框架令牌身份验证是否具有密码重置属性。我有一个 Django 应用程序,我在其中使用令牌身份验证来注册和登录用户。但有人告诉我,为了让我在 Django 应用程序中实现密码重置,我必须切换到 JWT 或 Knox 等软件包。但我想在不切换到 jwt 或类似包的情况下使用 drf 令牌身份验证。我该怎么办,可以吗?

【问题讨论】:

据我所知,令牌身份验证只会检查用户是否使用真实密码、用户名和/或电子邮件进行验证。密码重置由 django 自己管理。 【参考方案1】:

您可以使用Djoser,或创建一个端点,该端点可以向用户发送一封电子邮件,其中包含带有令牌和uid 的链接,另一个端点接收uid 和令牌并重置密码。

@api_view(["GET"])
def send_resetpassword_email(request, email):
    user = User.objects.get(email=email)
    if user.is_active == True:
        current_site = get_current_site(request)
        subject = "Please Reset your password"
        message = render_to_string(
            "reset_password_email.html",
            
                "user": user,
                "domain": current_site.domain,
                "uid": urlsafe_base64_encode(force_bytes(user.pk)),
                "token": account_activation_token.make_token(user),
            ,
        )
        user.email_user(subject, message)
        return Response(
            "message": "Reset Password Email Sent", status=status.HTTP_201_CREATED
        )
    return Response(
        "message": "user is not active", status=status.HTTP_400_BAD_REQUEST
    )


class ResetPassword(APIView):
    serializer_class = ResetPasswordSerializer

    def put(self, request, uidb64, token):
        try:
            uid = force_text(urlsafe_base64_decode(uidb64))
            user = User.objects.get(pk=uid)
        except (TypeError, ValueError, OverflowError, User.DoesNotExist):
            user = None

        if user is not None and account_activation_token.check_token(user, token):
            serializer = self.serializer_class(data=request.data)
            if serializer.is_valid():
                user.set_password(request.data.get("password"))
                user.save()
                return Response(
                    "message": "Password Reset Successfull", status=status.HTTP_200_OK
                )
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response(
                "message": "Password Reset Failed", status=status.HTTP_400_BAD_REQUEST
            )

所以你必须创建一个重置密码序列化程序

【讨论】:

以上是关于Drf令牌认证密码重置的主要内容,如果未能解决你的问题,请参考以下文章

身份密码重置令牌无效

Laravel 更改密码重置特定令牌的令牌持续时间

如何检查密码重置令牌是不是已过期?

生成重置密码令牌的最佳实践

密码重置令牌存储 - 值应该被散列吗?

设计:如何自定义重置密码令牌?