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

トークンはステートレスなので、standart Djangoセッションの認証と同じではないので、そのトークンをすべての要求に入れる必要があります。認証ヘッダを修正するためにテスト目的のために
あなたはmodheader
がヘッダーに入れて、たとえば、いくつかのクロームプラグインをインストールすることができます。

Authorization: Token <your_toke_string> 

、ユーザーが認証されます

+0

私はpostmanを使ってログイン/ログアウト要求を行います。トークンはヘッダーにあります。私はそれが正しいことを確認した。私のログアウトビューでは 'token'が正しいので、問題はトークンが見つからないことではありません。問題は 'Token.objects.filter(key = token、user = request.user)'です。特に 'request.user'です。これは、 'User'オブジェクトを返すわけではありません。 –

+0

@A.Wongだから、あなたのトークンはincorectです。なぜなら、 'request.user'がUserオブジェクトを返し、' request.auth'が 'BasicToken'インスタンスを返さなければならないからです。ヘッダーが設定されているときのあなたの 'request.auth'値は何ですか? –

+0

「なし」に設定されています。 –

関連する問題