웹 개발

[장고] 회원가입시 이메일 인증하기(이메일 유효성 검사) #5

성밍쟁 2024. 2. 11. 02:28
728x90
반응형

프롤로그

이메일 인증 이것도 처음인데 일단 시도는 해보기 위해서 넣을 것이다.

 

이메일 인증 주소 :

[ip]/signup/email_verify/

이메일 인증 완료

[ip]/signup/activate_email/<token>/<email>/

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

밑에 글들을 참고하였음.

 

https://woongsin94.tistory.com/300

 

Django 회원가입 이메일 인증(SMTP)

많은 포털 사이트에서 회원가입 시 웹 메일 인증 시스템을 채택하고 있다. (현재는 대부분 보안성 때문에 기기 인증 등도 활용되고 있다고 한다...) 프로젝트를 진행하면서 해당 부분이 필요하게

woongsin94.tistory.com

 

https://ssungkang.tistory.com/entry/Django-%E1%84%92%E1%85%AC%E1%84%8B%E1%85%AF%E1%86%AB%E1%84%80%E1%85%A1%E1%84%8B%E1%85%B5%E1%86%B8-%E1%84%89%E1%85%B5-%E1%84%8B%E1%85%B5%E1%84%86%E1%85%A6%E1%84%8B%E1%85%B5%E1%86%AF-%E1%84%8B%E1%85%B5%E1%86%AB%E1%84%8C%E1%85%B3%E1%86%BC-SMTP

 

[Django] 회원가입 시 이메일 인증, SMTP

SMTP SMTP 는 Simple Mail Transfer Protocol 의 약자로 전자 메일 전송을 위한 표준 프로토콜입니다. 이를 이용해서 인증메일을 보내보도록 하겠습니다. 사전 설정 IMAP 설정 : 링크로 들어가서 IMAP 1단계 설

ssungkang.tistory.com

 

https://velog.io/@dustndus8/Django12.-%EC%9D%B4%EB%A9%94%EC%9D%BC-%EC%9D%B8%EC%A6%9D

 

velog

 

velog.io

이렇게 글 3개를 참조했다.

 

 

사전 설정

pip install six

 

 

settings.py 에서 

EMAIL_HOST = 'smtp.gmail.com'
# 메일을 호스트하는 서버
EMAIL_PORT = '587'
# gmail과의 통신하는 포트
EMAIL_HOST_USER = '********@gmail.com'
# 발신할 이메일
EMAIL_HOST_PASSWORD = '********'
# 발신할 메일의 비밀번호
EMAIL_USE_TLS = True
# TLS 보안 방법
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
# 사이트와 관련한 자동응답을 받을 이메일 주소,'webmaster@localhost'

저 email_host_password 부분에다가 어떤 것을 넣을것이냐인데

구글 지메일 -> 설정 -> 모든 설정 보기-> 전달 및 pop/imap 에서 imap 를 사용하는 것으로 체크해두고, 

구글 계정관리 -> 보안 -> 2단계 인증 -> 맨 아래에 앱 비밀번호 에서 앱 이름 하나 생성하고 비밀번호 나온 것을 입력하는 것이다.

 

그러고

python manage.py shell

에 들어가서

>>> from django.core.mail import EmailMessage
>>> email = EmailMessage('title', 'content', to=['hey_minj@naver.com'])
>>> email.send()
1
>>> exit()

이렇게 뜨면 이메일이 정상적으로 오는 것을 확인할 수 있다.

이러면 이메일 보내지는 게 정상적으로 실행된다.

 

 

 

이메일 인증링크 발송 뷰

내가 구현할 것은 제일 먼저 이 이메일 주소가 지금 사용가능한지 판단이지, 직접적인 인증이 아니다.

그래서 생각해야할 것은, 이 이메일이 현재 다른 사람이 사용중이 아닌가랑, 실제로 사용할 수 있는, 인증 가능한 이메일인가 두 가지를 생각해야한다.

# views.py
from django.core.mail import send_mail
from django.http import JsonResponse
from django.urls import reverse
from django.utils.http import urlsafe_base64_encode
from django.utils.encoding import force_bytes
import hashlib
import base64

@csrf_exempt
def email_verify(request):
    data = json.loads(request.body)
    email = data.get('email')
    if email is None:
        return JsonResponse({'error': '이메일 주소가 제공되지 않았습니다.'}, status=400)

    if User.objects.filter(email=email).exists():
        return JsonResponse({'error': '이미 사용 중인 이메일입니다.'}, status=400)

    # 이메일 주소를 기반으로 간단한 토큰 생성
    token = base64.urlsafe_b64encode(hashlib.sha256(email.encode()).digest()).decode()

    # 이메일 인증 링크 생성
    activation_link = request.build_absolute_uri(
        reverse('activate_email', kwargs={'token': token, 'email': urlsafe_base64_encode(force_bytes(email))}))

    # 이메일 발송
    send_mail(
        '이메일 인증을 완료해주세요',
        f'아래 링크를 클릭하여 이메일 인증을 완료하세요: {activation_link}',
        '************@gmail.com',
        [email],
        fail_silently=False,
    )
    return JsonResponse({'message': '인증 메일을 발송하였습니다. 메일을 확인해 주세요.'})

 

 

 

 

이메일 인증 링크 처리뷰

# views.py
from django.http import JsonResponse
from django.utils.http import urlsafe_base64_decode
from django.utils.encoding import force_text

def activate_email(request, token, email):
    decoded_email = force_text(urlsafe_base64_decode(email))
    generated_token = base64.urlsafe_b64encode(hashlib.sha256(decoded_email.encode()).digest()).decode()

    if token == generated_token and not User.objects.filter(email=decoded_email).exists():
        # 이메일 주소가 유효하고 아직 등록되지 않았음을 확인
        return JsonResponse({'message': '이메일이 성공적으로 인증되었습니다. 회원가입을 계속 진행해주세요.'})
    else:
        return JsonResponse({'error': '유효하지 않은 인증 요청입니다.'}, status=400)

 

 

url매핑

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('email_verify/', views.email_verify, name='email_verify'),
    path('activate_email/<token>/<email>/', views.activate_email, name='activate_email'),
]

 

 

 

테스트

이렇게 이메일 주소를 입력하면, 인증메일이 발성했음을 확인하고

 

이메일을 확인하면

링크가 왔다. 저 링크를 복사해서

GET요청을 하면 이메일 인증이 성공했다고 뜨는 것을 확인할 수 있다.

 

 

 

에필로그

다음은 핸드폰 인증이나 해보자.

 

 

728x90
반응형