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令牌认证密码重置的主要内容,如果未能解决你的问题,请参考以下文章