0

인증을 위해 django-rest-framework-jwt를 구현하려고합니다. 나는 jwt 튜토리얼에서 말한 모든 것을했다. (설정, URL, 컬 테스트 추가). 탐색 가능한 API에서 127.0.0.1:8000/api/auth/token/을 사용하여 성공적으로 토큰을 얻었습니다.로그인 프로세스에서 rest_framework_jwt 토큰을 생성하는 방법

하지만 로그인 프로세스에서 토큰을 생성하는 방법에 대해서는 알지 못합니다. 내 생각 엔 LoginSerializer에서 생성하는 것일까? (아니면 내가 개념을 오해!)

가 여기에 내가 가진 무엇 :

# settings.py 
REST_FRAMEWORK = { 
    'DEFAULT_RENDERER_CLASSES': (
     'rest_framework.renderers.JSONRenderer', 
     'rest_framework.renderers.BrowsableAPIRenderer', 
    ), 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 
     'rest_framework.authentication.SessionAuthentication', 
    ), 
    'DEFAULT_PERMISSION_CLASSES': (
     'rest_framework.permissions.IsAuthenticated', 
    ), 
} 

# project/urls.py 
url(r'^api/auth/token/', obtain_jwt_token), 

로그인 시리얼 라이저와보기 :

class UserLoginSerializer(ModelSerializer): 
    token = CharField(allow_blank=True, read_only=True) 
    class Meta: 
     model = User 
     fields = ('username', 'password', 'token') 

    def validate(self, data): 
     username = data.get('username',None) 
     password = data['password'] 

     user = authenticate(username=username, password=password) 
     if not user or not user.is_active: 
      raise ValidationError("Invalid username/password.") 

     # generate jwt token ?? 
     # data['token'] = generated jwt token?? 

     return data 


class UserLoginAPIView(APIView): 
    permission_classes = [AllowAny] 
    serializer_class = UserLoginSerializer 

    def post(self, request, *args, **kwargs): 
     data = request.data 
     serializer = UserLoginSerializer(data=data) 
     if serializer.is_valid(raise_exception=True): 
      new_data = serializer.data 
      return Response(new_data, status=HTTP_200_OK) 
     return Response(serializer.errors, status=HTTP_400_BAD_REQUEST) 

그래서 내가 무엇을해야합니까를?

답변

1

내가 한 일은 다음과 같습니다.

from rest_framework_jwt.settings import api_settings 


class LoginView(APIView): 
    ''' 
    Post call for user login. 
    ''' 

    def post(self, request, format=None): 
     serializer = LoginSerializer(data=request.data) 

     if serializer.is_valid(): 

      # Check if user has valid credentials and return user instance else None 
      user = authenticate(username=serializer.validated_data['username'], 
           password=serializer.validated_data['password']) 

      if user is not None: 

       jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER 
       jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER 

       payload = jwt_payload_handler(user) 
       token = jwt_encode_handler(payload) 

       return Response({'msg':'Login successful', 'token': token, 'is_login_success': True}, status=status.HTTP_200_OK) 
      else: 
       return Response({'msg': 'Credentials are not valid!'}, status=status.HTTP_400_BAD_REQUEST) 
     else: 
      return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

하지만 당신은 당신이에 로그인하기 전에 뭔가를 기록하지 않으려면, 당신 127.0.0.1:8000/api/auth/token/ 꽤 동일하고있는 것을 할 필요 없다.

더 많은 정보를 원한다면 어떻게 obtain_jwt_token보기 작품의 JSONWebTokenSerializer 너를 도울 것이다.