본문 바로가기

내일배움 캠프/TIL

2023 05 10 Django 이메일 인증하기

django에 기본으로 탑재되어있는 from django.core.mail 를 이용해서 이메일을 보내고 인증코드를 입력하면

회원가입이 되게 만들었다

 

먼저 mail을 보내기 위해 settings.py에서 설정을 해줘야하는데

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 587
EMAIL_HOST_USER = get_secret("EMAIL")
EMAIL_HOST_PASSWORD = get_secret("EMAIL_PASSWORD")
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

저는 구글이메일을 사용해서 보냈는데 이와같이 설정하고 email과 앱 비밀번호를 따로 설정해서 이메일이 보내지게했습니다

gmail설정에 가서 아래와같이 IMAP를 사용할 수 있게하고

구글 2단계 인증에서 앱비밀번호를 설정해서 16자리의 코드를 넣어주면된다

그리고 나서 view에서 작업을 해줘야하는데

class SendVerificationCodeView(APIView):
    def post(self, request):
        email = request.data.get('email', '')            
        if not email:
            return Response({"message": "이메일을 입력해주세요."}, status=status.HTTP_400_BAD_REQUEST)
        elif User.objects.filter(email=email).exists():
            return Response({"message": "이미 가입된 이메일입니다."}, status=status.HTTP_400_BAD_REQUEST)
        code = Verify.objects.filter(email=email)
        if code.exists():
            code.delete()
        verification_code = get_random_string(length=6) 
        message = f"인증코드는 {verification_code}  입니다"
        email_message = EmailMessage(
            subject='Verification Code',
            body=message,
            to=[email],
        )
        verify_code = Verify(email=email, code=verification_code)
        verify_code.save()
        email_message.send() # 이메일 전송
        return Response({'verification_code': verification_code}) # 인증 코드 반환

위의 코드와 같이 email이 가입되어있는지 아니면 이메일이 비어있는지 확인하고 db에 이미 같은이메일의 인증이 있으면 db를 지우고 이메일로 인증코드를 보내고 그 코드와 이메일을 db에 저장을 했다

class UserView(APIView) :
    def post(self, request):
        verification_serializer = VerificationCodeSerializer(data=request.data)
        if verification_serializer.is_valid():
        serializer = UserSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
            return Response({"massage":"가입완료"}, status= status.HTTP_201_CREATED)
    else:
        return Response({"message":f"${verification_serializer.errors}"}, status=status.HTTP_400_BAD_REQUEST)

그리고 회원가입을할떄 코드가 db에 저장되어있는 코드랑맞는지 확인하는 serialize를 돌려서 처리를 했습니다

class VerificationCodeSerializer(serializers.Serializer):
    email = serializers.EmailField()
    code = serializers.CharField(max_length=6)
    
    def validate(self, data):
        email = data.get('email')
        code = data.get('code')
        verify = get_object_or_404(Verify, email=email)
        if code == verify.code:  # 인증코드 일치 여부 확인
            verify.delete()  # 인증코드 삭제
            return data
        else:
            raise serializers.ValidationError("Invalid verification code")

해당 코드가 맞는지 아닌지 확인하는 시리얼라이즈는 이런식으로 db에서 가져오는 방식으로 구현했습니다

끈끈

'내일배움 캠프 > TIL' 카테고리의 다른 글

display:none 이란(사실아님)  (2) 2023.05.15
카카오 애플리케이션 설정  (0) 2023.05.15
2023 05 08 TIL 팀프로젝트 시작  (0) 2023.05.09
코딩테스트 체육복  (0) 2023.05.07
코딩테스트 신규 아이디 추천  (0) 2023.05.03