django-rest-framework - 令牌认证后Django Rest Framework注销不起作用
问题描述
我已经成功地在 django rest 框架中使用令牌身份验证机制进行身份验证,但是当我调用 logout 函数时,它显示错误'AnonymousUser' object has no attribute 'auth_token',不知道为什么它返回 AnonymousUser。
## Serializer ##
class AdminLoginSerializer(serializers.Serializer):
username = serializers.CharField()
password = serializers.CharField()
def validate(self, data):
username = data.get("username", "")
password = data.get("password", "")
if username and password:
user = authenticate(username=username, password=password)
if user:
if user.is_active:
data["user"] = user
else:
msg = 'User is deactivated'
raise exceptions.ValidationError(msg)
else:
msg = "Unable to login with given credentials"
raise exceptions.ValidationError(msg)
else:
msg = 'Must Provide Username and password'
raise exceptions.ValidationError(msg)
return data
## Viewsets ##
class AdminLoginView(APIView):
def post(self, request):
serializer = AdminLoginSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
# django_login(request, user)
token, created = Token.objects.get_or_create(user=user)
return Response({"token": token.key, 'id': token.user.id}, status=200)
class AdminLogoutView(APIView):
authentication_classes = [TokenAuthentication]
def post(self, request):
# django_logout(request)
**request.user.auth_token.delete()**
return Response(status=204)
解决方案
我认为您没有提供loginView
从新请求中获得的令牌到logoutView
. 所以 TokenAuthenticationrequest.user
用 AnonymousUser 填充。
将IsAuthenticated
权限类添加到您的 LogoutViet 以防止未经身份验证的用户。
from rest_framework import permissions
class AdminLogoutView(APIView):
permission_classes = [permissions.IsAuthenticated]
此外,检查 TokenAuthentication 例程,并将令牌完全像这样放入请求中。您应该以这样的模式在 HTTP 标头中传递令牌,Authorization
例如:
Authorization: Token 401f7ac837da42b97f613d789819ff93537bee6a
推荐阅读
- javascript - 在JS的导航栏中向下滚动时如何显示不同的徽标颜色
- visual-studio - 为什么这段代码在 Visual Studio 2019 中被圈出(即概述)?
- notepad++ - 如何为插件功能添加热键快捷方式?
- azure - 在 Azure DevOps Pipelines 中使用 GPU 创建 VM 的最佳实践
- jms - 用户没有权限=使用 Artemis 2.10.1 中的自定义 JAAS 模块发送
- node.js - 请求有效负载即使在 https 上也以明文形式显示凭据
- amazon-s3 - 下载给定开始时间和结束时间的部分视频(将时间范围转换为字节范围)
- php - 在laravel中加载双向递归关系
- c# - Windows 服务中随机出现 System.ArgumentNullException
- java - Solr - 索引的内存要求