2015-09-27 55 views
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。

有关如何解决此问题的任何想法?

回答

0

你可以简单地检查是否有有效的标记已经存在于数据库中的同一个用户。代替上述方法的

token, created = Token.objects.get_or_create(user=user) 

你应该使用

try: 
    token = Token.objects.get(user=user) // Chcck if token is present 
except Token.DoesNotExist: 
    token = Token.objects.create(user=user) // Create new token, no token for this user 
else: 
    return Response({'error': 'Already logged in', status=400}) 
+0

谢谢您的回答。问题是我在用户注册时创建了令牌,所以令牌已经存在于数据库中 –

+0

在这种情况下,您可以在用户注销时从服务器端删除令牌。所以这将意味着令牌将仅存在于登录用户。 现在如果你申请了一个新的令牌,你会得到它,如果该令牌已经不在该用户的数据库中。 –

+0

感谢您的帮助,但我最终以其他方式检查了它。不管怎么说,还是要谢谢你 :) –