0

我使用DRF 1.10和Python 3.5。如何使用Django Rest Framework正確設置令牌認證?

我試圖使用DRF的rest_framework.authtoken.models.Token在登錄時對用戶進行身份驗證。這是我有:

views.py

class LoginView(views.APIView): 
    serializer_class = LoginSerializer 

    def post(self, request, **kwargs): 
     serializer = self.serializer_class(data=request.data) 
     if serializer.is_valid(): 
      user = User.objects.get(username=serializer.data['username']) 
      token = Token.objects.create(user=user) 

      response = {} 
      response['user'] = serializer.data 
      response['token'] = token.key 

      return Response(response, status=status.HTTP_200_OK) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

serializers.py

class LoginSerializer(serializers.Serializer): 
    username = serializers.CharField() 
    password = serializers.CharField() 

    def validate(self, attrs): 
     username = attrs.get("username").lower() 
     password = attrs.get("password") 

     user = authenticate(username=username, password=password) 

     if user: 
      attrs["user"] = user 
      return attrs 
     else: 
      raise serializers.ValidationError(
       "Unable to login with credentials provided." 
      ) 

在登錄我想提供一個令牌用戶和註銷我想刪除令牌。問題是,當我試圖通過令牌的密鑰和與其相關的用戶查找令牌來刪除令牌時,我無法找到該令牌。註銷視圖在這裏:

class LogoutView(views.APIView): 
    def post(self, request, **kwargs): 
     try: 
      token = request.META['HTTP_AUTHORIZATION'].split(" ")[1] 
      invalidate_token = Token.objects.filter(key=token, user=request.user) 
      invalidate_token.delete() 

     return Response({ detail: "Logged out"}, status=status.HTTP_202_ACCEPTED) 
    except: 
     return Response({"error": ["Token does not exist!"]}, status=status.HTTP_400_BAD_REQUEST) 

我試圖登錄用戶時出現問題。我意識到request.user仍然是AnonymousUser而不是User。我該如何解決這個問題?

Header from Postman

這是我在郵遞員頭。

+0

如果您已經安裝Django管理,您可以在那裏查看您的身份驗證令牌。比較它們以確保您使用的令牌仍然存在並與正確的django用戶相關聯。 – Soviut

+0

@Soviut剛剛查看了管理工具。令牌確實存在並與正確的用戶相關聯,但仍然無法正常工作。 –

回答

0

由於令牌是無狀態的,它與標準的Django會話認證不同,所以您應該將該令牌放入所有請求中。
出於測試目的,你可以安裝一些鍍鉻插件修改授權頭,例如modheader
放入標題:

Authorization: Token <your_toke_string> 

而且用戶將進行身份驗證

+0

我使用郵遞員進行登錄/註銷請求。令牌位於標題中。我確信它是正確的。問題不是令牌丟失,因爲在我的註銷視圖中,'token'是正確的。問題是'Token.objects.filter(key = token,user = request.user)',特別是'request.user'。這並不是返回'User'對象,因爲它應該是。 –

+0

@ A.Wong所以我覺得你的令牌不適用,因爲'request.user'應該返回User對象,'request.auth'應該返回'BasicToken'實例。現在設置標題時,你的request.auth值是什麼? –

+0

它被設置爲「無」。 –

相關問題