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 사용자와 연관되어 있는지 확인하십시오. – Soviut

+0

@Soviut 관리자 도구를 보았습니다. 토큰은 존재하지만 올바른 사용자와 연관되어 있지만 여전히 제대로 작동하지 않습니다. –

답변

0

토큰은 stateless이므로 standart 장고 세션 인증과 동일하지 않으므로 모든 토큰에 토큰을 넣어야합니다. 인증 헤더를 수정하기위한 테스트 목적으로
당신은 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

'없음'으로 설정됩니다. –

관련 문제