2014-12-19 2 views
7

Я бы хотел отменить предыдущий токен каждый раз, когда пользователь входит в систему. Это означало бы создание нового токена (или, по крайней мере, изменение ключа существующей модели). Все это звучит просто, но в документах DRF я не вижу упоминания об этом сценарии. Документы, похоже, предполагают, что токен всегда остается неизменным. Это просто случай, или я чего-то не хватает? Мой вопрос: что-то не так с изменением токена каждый раз, когда пользователь входит в систему?Изменить токен для TokenAuthentication каждый раз, когда пользователь регистрируется в

ответ

12

TokenAuthentication, предоставленный Django REST Framework, предназначен для использования в простых случаях, когда токен не нуждается в изменении, и для пользователя существует только один токен.

Документы, похоже, предполагают, что токен всегда остается неизменным.

Это правильно. Все, что необходимо, должно быть реализовано независимо.

Я хотел бы, чтобы отменить ПРИОР лексема каждый раз, когда пользователь входит в систему.

Вы можете сделать это в целях аутентификации путем удаления каких-либо маркеров для пользователя, вошедшего в систему.

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

Смежные вопросы