Django rest framework 每次用户登录时更改令牌身份验证的令牌

Django rest framework 每次用户登录时更改令牌身份验证的令牌,django-rest-framework,Django Rest Framework,我想在用户每次登录时撤销先前的令牌。这意味着生成一个新的令牌(或者至少更改现有模型实体的密钥)。这听起来很简单,但在DRF文档中,我没有看到任何关于这种情况的提及。文档似乎假定令牌始终保持不变。这只是一个简单的例子,还是我遗漏了什么?我的问题是:每次用户登录时更改令牌是否有问题?Django REST Framework提供的TokenAuthentication旨在用于令牌永远不需要更改且用户只有一个令牌的简单情况 文档似乎假定令牌始终保持不变 这是正确的。任何额外的功能都必须独立实现 我想在

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

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

文档似乎假定令牌始终保持不变

这是正确的。任何额外的功能都必须独立实现

我想在用户每次登录时撤销先前的令牌

您可以在authentication视图中通过删除登录用户的任何令牌来执行此操作

from rest_framework.authtoken.models import Token

Token.objects.filter(user=the_user).delete()
如果您正在使用为令牌身份验证提供的视图,那么您将需要始终为用户获取新令牌

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

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

非常感谢@kevin brown。伟大、清晰、彻底的回答。@Kevin Brown这仅仅是我的印象还是DRF在API会话身份验证方面似乎缺乏文档和资源?到目前为止,令牌身份验证似乎是开发了多个第三方软件包的最受认可的方法。