2014-12-19 32 views
7

每次用户登录时,我想撤销之前的令牌。这意味着要生成新令牌(或至少更改现有模型实体的密钥)。这听起来很简单,但在DRF文档中,我没有看到任何提及的情况。文档似乎假设令牌始终保持不变。这只是一个简单的例子,还是我错过了什么?我的问题是:每次用户登录时更改标记是否有问题?每次用户登录时更改TokenAuthentication的令牌

回答

12

Django REST Framework提供的TokenAuthentication旨在用于简单的情况,其中令牌永不需要更改,并且只有一个用户令牌。

该文档似乎假设令牌始终保持不变。

这是正确的。任何额外的事情都必须独立实施。

我想每一次撤销之前令牌用户登录。

您可以通过消除对谁是登录用户的任何令牌认证视图做到这一点。

from rest_framework.authtoken.models import Token 

Token.objects.filter(user=the_user).delete() 

如果您使用的是用于令牌认证的视图,那么您将需要subclass them来始终为用户获取新的令牌。

class ObtainAuthToken(APIView): 
    throttle_classes =() 
    permission_classes =() 
    parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,) 
    renderer_classes = (renderers.JSONRenderer,) 

    def post(self, request): 
     serializer = AuthTokenSerializer(data=request.data) 
     serializer.is_valid(raise_exception=True) 
     user = serializer.validated_data['user'] 

     Token.objects.filter(user=the_user).delete() 
     token, created = Token.objects.create(user=user) 

     return Response({'token': token.key}) 

这将始终无效以前的密钥并生成一个新的密钥。

+0

非常感谢@ kevin-brown。伟大,清晰,彻底的答案。 – jacob