728x90
반응형
프롤로그
2주간 말레이시아 해외 인턴십을 다녀오고, 현재 코로나 걸려서 3주간 블로그를 쉬고 있다.
그래서 pom 프로젝트나 쉬는 동안 끝내보자.
모델생성
임시적으로 사용가능한 이메일인지 체크만 할 것을 구상하였기에 임시 데이터베이스를 만들었다.
class TempEmailVerify(models.Model):
email = models.EmailField(unique=True)
verification_code = models.CharField(max_length=6)
created_at = models.DateTimeField(auto_now_add=True)
def is_expired(self):
# 인증 코드의 유효 시간을 1시간으로 설정
return self.created_at < (datetime.datetime.now() - datetime.timedelta(hours=1))
유효시간 1시간으로 설정하였다.
views.py 설정
그 다음으로는 이메일 인증이 들어오면, email을 POST요청으로 받을 시에 , 해당 이메일에 임시적인 6글자 짜리 코드를 넣어주려고 한다.
@csrf_exempt
def create_and_send_verification_email(request):
if request.method == 'POST':
try:
data = json.loads(request.body)
email = data['email']
# 이메일 주소가 제공되지 않았다면 오류 반환
if not email:
return JsonResponse({'error': '이메일 주소를 제공해주세요.'}, status=400)
# 이메일 중복 확인
if User.objects.filter(email=email).exists():
return JsonResponse({'error': '이미 사용중인 이메일입니다.'}, status=400)
# 기존의 인증 코드가 있다면 삭제
TempEmailVerify.objects.filter(email=email).delete()
# 새로운 인증 코드 생성 및 저장
verification_code = get_random_string(length=6, allowed_chars='1234567890')
TempEmailVerify.objects.create(email=email, verification_code=verification_code)
# 이메일 전송 로직
send_mail(
'PoM 회원가입 이메일 인증 코드',
f'해당 코드를 입력하세요 : {verification_code}',
'your_email@example.com', # 보내는 이메일 주소를 여기에 넣으세요.
[email],
fail_silently=False,
)
return JsonResponse({'message': '인증 코드가 이메일로 전송되었습니다.'}, status=200)
except KeyError:
return JsonResponse({'error': '이메일 주소가 제공되지 않았습니다.'}, status=400)
except Exception as e:
return JsonResponse({'error': str(e)}, status=500)
else:
return JsonResponse({'error': 'POST 요청이 필요합니다.'}, status=405)
이메일 중복 부터 체크하고, 기존의 인증코드가 있다면 삭제하고
새로운인증코드를 넣고 메일을 보낸다.
이메일 검증 코드
def verify_code(request):
if request.method != 'POST':
return JsonResponse({'error': 'POST 요청이 필요합니다.'}, status=405)
try:
data = json.loads(request.body)
email = data.get('email')
code = data.get('code')
if not email or not code:
return JsonResponse({'error': '이메일과 코드를 모두 입력해주세요.'}, status=400)
verification_entry = TempEmailVerify.objects.get(email=email)
if timezone.now() > verification_entry.created_at + timezone.timedelta(hours=1):
verification_entry.delete()
return JsonResponse({'error': '코드가 만료되었습니다.'}, status=410)
if verification_entry.verification_code == code:
verification_entry.delete()
return JsonResponse({'message': '인증에 성공하였습니다. 회원가입을 계속 진행해주세요'}, status=200)
else:
return JsonResponse({'error': '코드가 일치하지 않습니다'}, status=400)
except TempEmailVerify.DoesNotExist:
return JsonResponse({'error': '유효하지 않은 코드입니다.'}, status=404)
except json.JSONDecodeError:
return JsonResponse({'error': '유효하지 않은 JSON 형식입니다.'}, status=400)
except Exception as e:
return JsonResponse({'error': '서버 오류가 발생했습니다.'}, status=500)
이메일 검증하는 단계이다.
검증이 완료되면 회원가입 계속 진행하라는 말과 함께 이메일 검증이 끝난다. 백엔드쪽에서는 그냥 검증되고 사용가능한 것을 프론트엔드에 알려주기만 하면 된다.
urls.py
path('verify-email/', views.create_and_send_verification_email, name='verify_email'),
path('verify-code/', views.verify_code, name='verify_code'),
이메일 코드 생성 : verify-email
이메일 검증 : verify-code
테스트
http://localhost:8000/signup/verify-email/
에는 이메일만
이메일 인증을 보내면
메일이 오고
verify-code 에 넣으면 인증이 된다.
에필로그
나중에 자동적으로 데이터베이스 생성된지 1시간 된 임시 데이터베이스 지우는 거 설정해야한다.
728x90
반응형
'웹 개발' 카테고리의 다른 글
[장고] 회원가입시 이메일 인증하기(이메일 유효성 검사) #5 (1) | 2024.02.11 |
---|---|
[장고] JWT 사용하기 #4 (0) | 2024.02.10 |
[장고] 장고로 JWT 사용하기 #3 (1) | 2024.01.31 |
[장고] 회원가입 DRF이용하여 만들기 #2 (0) | 2024.01.30 |
[장고] 프로젝트 Model 작성하기 #1 (1) | 2024.01.29 |