[장고] 회원가입 기능 상세하게 마무리 (이메일 인증)

2024. 3. 8. 00:29· 웹 개발
목차
  1. 프롤로그
  2. 모델생성
  3. views.py 설정
  4. 이메일 검증 코드
  5. urls.py
  6. 테스트
  7. 에필로그
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
반응형
저작자표시 비영리 (새창열림)

'웹 개발' 카테고리의 다른 글

[SpringBoot] docker-java 사용하여 스프링부트로 도커 조작하기 - 컨테이너 생성(1/3)  (0) 2025.02.13
[SpringBoot] docker-java 사용하여 스프링부트로 도커 조작하기 - 사전준비  (0) 2025.02.13
[장고] 회원가입시 이메일 인증하기(이메일 유효성 검사) #5  (1) 2024.02.11
[장고] JWT 사용하기 #4  (0) 2024.02.10
[장고] 장고로 JWT 사용하기 #3  (1) 2024.01.31
  1. 프롤로그
  2. 모델생성
  3. views.py 설정
  4. 이메일 검증 코드
  5. urls.py
  6. 테스트
  7. 에필로그
'웹 개발' 카테고리의 다른 글
  • [SpringBoot] docker-java 사용하여 스프링부트로 도커 조작하기 - 컨테이너 생성(1/3)
  • [SpringBoot] docker-java 사용하여 스프링부트로 도커 조작하기 - 사전준비
  • [장고] 회원가입시 이메일 인증하기(이메일 유효성 검사) #5
  • [장고] JWT 사용하기 #4
성밍쟁
성밍쟁
성밍쟁 공붕방
성밍쟁
너드인의 밤
성밍쟁
전체
오늘
어제
  • 분류 전체보기 (182)
    • 일상 (1)
    • 스펙업 (7)
      • 학회 (0)
      • 멋쟁이사자처럼 (2)
      • 2024 winter-study (5)
    • 코딩테스트 - 백준 (9)
    • 보안 스터디 (56)
      • 시스템 해킹 (10)
      • 리버스 엔지니어링 (0)
      • 웹 해킹 (38)
      • 암호학 (8)
    • bandit (15)
    • 웹 개발 (11)
    • 머신러닝 (0)
    • 데이터베이스 (9)
    • KnockOn (72)
    • DevOps (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 드림핵
  • /bin
  • 1074
  • 11656
  • 1193
  • 2563
  • 3Des
  • 9613
  • AES
  • Alias

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
성밍쟁
[장고] 회원가입 기능 상세하게 마무리 (이메일 인증)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.