ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DRF - User] 로그인 API
    한이음 프로젝트 2023. 8. 21. 16:34

    이번에는 회원가입에 이어서 로그인파트를 만들어보도록 하겠습니다.


    • Serializers.py
    • views.py
    • urls.py
    • postman 실행

    1. Serializer.py

     

    class LoginSerializer(serializers.Serializer):
        userIdx = serializers.IntegerField( read_only=True)
        username = serializers.CharField(max_length= 30, read_only=True)
        user_id = serializers.CharField(max_length = 30)
        email = serializers.EmailField(max_length= 30, read_only=True)
        password = serializers.CharField(max_length=128, write_only=True)
        last_login = serializers.CharField(max_length=255, read_only=True)
        access_token = serializers.CharField(max_length=255, read_only=True)
        refresh_token = serializers.CharField(max_length=255, read_only=True)
        
        def validate(self,data):
            user_id = data.get('user_id', None)
            password = data.get('password', None)
            
            if user_id is None:
                raise serializers.ValidationError(
                    '로그인하려면 아이디가 필요합니다.'
                )
            if password is None:
                raise serializers.ValidationEroor(
                    '로그인하려면 비밀번호가 필요합니다.'
                )
            
            # db와 매칭시킨다. 없을경우 None 반환시킴 이는 사용자 모델 필드를 검사하는 함수임
            user = authenticate(user_id=user_id, password=password)
            
            if user is None:
                raise serializers.ValidationError(
                    '해당 아이디 혹은 패스워드를 찾을 수 없습니다.'
                )
            
            if not user.is_active:
                raise serializers.ValidationError(
                    '해당 계정은 비활성화 상태입니다.'
                )
            
            user.last_login = timezone.now()
            user.save(update_fields=['last_login'])
            
            # Generate JWT tokens
            refresh = RefreshToken.for_user(user)
            access_token = str(refresh.access_token)
            refresh_token = str(refresh)
    
            
            return{
                'userIdx' : user.userIdx,
                'user_id' : user.user_id,
                'username': user.username,
                'email': user.email,
                'last_login': user.last_login,
                'access_token': access_token,
                'refresh_token': refresh_token
            }

    2. Views.py

     

    다음은 view.py에 아래와 같이 작성할 것입니다.

    class LoginAPIView(APIView):
        permission_classes = (AllowAny,)
        serializer_class = LoginSerializer
        
        def post(self, request):
            
            user= request.data
            
            serializer = self.serializer_class(data=user)
            serializer.is_valid(raise_exception= True)
            
            return Response(serializer.data, status=status.HTTP_200_OK)

     


    3. urls.py

     

    urls.py에는 아까 views.py에 추가한 코드를 사용하기 위해 코드를 추가해줍니다.

    urlpatterns = [
        path('register', RegistrationAPIView.as_view()),
        path('login', LoginAPIView.as_view()), # 추가
        ]

    4. postman

     

    <request>

     

    <response>

    이렇게 로그인까지 완료했습니다. jwt 토큰까지 발행을 완료했습니다.

    다음 시간에는 회원가입을 할때 번호를 사용해서 인증번호를 받아오는 것을 배우도록 하겠습니다.

     

     

     

     

     

     

     

     

Designed by Tistory.