T.I.L July 06, 2023 - [DRF]간단한 계정 찾기(계정 재활성화)로직 구현

2023. 7. 7. 00:08T.I.L (Today_I_Learned)

탈퇴(계정 비활성화)인 유저가 탈퇴 계정으로 로그인을 시도할 때


코드

class CustomTokenObtainPairView(TokenObtainPairView):
    permission_classes = [AllowAny]
    serializer_class = CustomTokenObtainPairSerializer
    
    def post(self, request):
        user = User.objects.get(email=request.data['email'])
        is_withdrawal=user.withdrawal
        if is_withdrawal == True:
            user.withdrawal = False
            user.is_active = True
            user.save()
            return Response({"withdrawal_true": "계정이 재활성화 되었습니다. 로그인을 진행해 주세요!"}, status=status.HTTP_423_LOCKED)
        return super().post(request)

간단하게 구성해 본 로직입니다.

문제점

1. 본인임을 인증하는 로직이 추가되면 좋겠습니다.

2. 예외처리가 더 필요합니다.

 

 

탈퇴(계정 비활성화)인 유저가 탈퇴 계정으로 회원가입에 필요한

이메일 인증을 시도할 때


코드

# views.py
class SendSignupEmailView(APIView):
    permission_classes = [AllowAny]

    def post(self, request):
        try:
            user = User.objects.get(email=request.data['email'])
        
            if user.withdrawal == True:
                user.withdrawal = False
                user.is_active = True
                user.save()
                return Response({"withdrawal_true": "계정이 재활성화 되었습니다. 로그인을 진행해 주세요!"}, status=status.HTTP_423_LOCKED)
            else:
                raise User.DoesNotExist
        except User.DoesNotExist:
            serializer = SendSignupEmailSerializer(
                data=request.data, context={"request": request})
            
            if serializer.is_valid():
                return Response({"message": "이메일 인증코드를 회원님의 이메일 계정으로 발송했습니다. 확인 부탁드립니다!"}, status=status.HTTP_200_OK)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
 

# serializers.py
class SendSignupEmailSerializer(serializers.Serializer):
    email = serializers.EmailField(
        error_messages={
            "required": "이메일을 입력해주세요.",
            "blank": "이메일을 입력해주세요.",
        }
    )
    time_check = serializers.IntegerField()

    class Meta:
        fields = ("email", "date")

    def validate(self, attrs):
        email = attrs.get("email")
        time_check = attrs.get("time_check")
        verification_code = VerificationCodeGenerator.verification_code(
            email, time_check)

        try:
            User.objects.get(email=email)

            raise serializers.ValidationError(
                detail={"email": "이미 존재하는 계정의 이메일 주소입니다."})

        except User.DoesNotExist:
            email_body = "아래 인증코드를 인증코드 작성란에 기입해주세요. \n " + verification_code
            message = {
                "email_body": email_body,
                "to_email": email,
                "email_subject": "EcoCanvas 이메일 인증 코드",
            }
            Util.send_email(message)

            return super().validate(attrs)

 

문제점

1. 본인임을 인증하는 로직이 추가되면 좋겠습니다.

2. 예외처리가 로그인 로직보다는 개선 되었지만 조금 더 개선하면 좋겠습니다.