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 |