7
每次用户登录时,我想撤销之前的令牌。这意味着要生成新令牌(或至少更改现有模型实体的密钥)。这听起来很简单,但在DRF文档中,我没有看到任何提及的情况。文档似乎假设令牌始终保持不变。这只是一个简单的例子,还是我错过了什么?我的问题是:每次用户登录时更改标记是否有问题?每次用户登录时更改TokenAuthentication的令牌
每次用户登录时,我想撤销之前的令牌。这意味着要生成新令牌(或至少更改现有模型实体的密钥)。这听起来很简单,但在DRF文档中,我没有看到任何提及的情况。文档似乎假设令牌始终保持不变。这只是一个简单的例子,还是我错过了什么?我的问题是:每次用户登录时更改标记是否有问题?每次用户登录时更改TokenAuthentication的令牌
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})
这将始终无效以前的密钥并生成一个新的密钥。
非常感谢@ kevin-brown。伟大,清晰,彻底的答案。 – jacob