首页 > 解决方案 > Drf令牌认证密码重置

问题描述

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

标签: python-3.xdjangodjango-rest-frameworktoken

解决方案


您可以使用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
            )

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


推荐阅读