2014-12-19 33 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