0
我有一个登录/注销模块在我的Django应用程序(使用DRF)。Django的 - 从两个客户端阻止登录相同的用户
它工作在令牌认证 - 当他在用户登录通过用户名和密码,并得到一个令牌,可以永久使用。
(我将令牌保存在我的客户端应用程序中)。 当他注销时 - 我从客户端应用程序删除令牌。
我注意到的问题是,当一个客户端(Android应用程序)登录与USER1例如(目前拥有从服务器获得令牌),其他客户可以登录一样用户(提供相同的用户名和密码并获得令牌) - 现在我的两个客户端都以user1登录。
下面是获得令牌的Django代码:
class ObtainAuthTokenAndUser(APIView):
throttle_classes =()
permission_classes =()
parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
renderer_classes = (renderers.JSONRenderer,)
serializer_class = AuthTokenSerializer
def post(self, request):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
token, created = Token.objects.get_or_create(user=user)
user_serializer = UserSerializer(user)
return Response({'token': token.key, 'user': user_serializer.data})
obtain_auth_token_and_user = ObtainAuthTokenAndUser.as_view()
可我为了防止这种情况怎么办?
在另一个客户端尝试使用已经登录的用户登录时 - 我想发送一个“已经从另一个设备登录”消息和一个401 HTTP。
有关如何解决此问题的任何想法?
谢谢您的回答。问题是我在用户注册时创建了令牌,所以令牌已经存在于数据库中 –
在这种情况下,您可以在用户注销时从服务器端删除令牌。所以这将意味着令牌将仅存在于登录用户。 现在如果你申请了一个新的令牌,你会得到它,如果该令牌已经不在该用户的数据库中。 –
感谢您的帮助,但我最终以其他方式检查了它。不管怎么说,还是要谢谢你 :) –