每次用户登录时更改TokenAuthentication的令牌

时间:2014-12-19 16:48:02

标签: django-rest-framework

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

1 个答案:

答案 0 :(得分:14)

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})

这将始终使先前的密钥无效并生成新密钥。