프롤로그
이메일 인증 이것도 처음인데 일단 시도는 해보기 위해서 넣을 것이다.
이메일 인증 주소 :
[ip]/signup/email_verify/
이메일 인증 완료
[ip]/signup/activate_email/<token>/<email>/
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
밑에 글들을 참고하였음.
https://woongsin94.tistory.com/300
https://velog.io/@dustndus8/Django12.-%EC%9D%B4%EB%A9%94%EC%9D%BC-%EC%9D%B8%EC%A6%9D
이렇게 글 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요청을 하면 이메일 인증이 성공했다고 뜨는 것을 확인할 수 있다.
에필로그
다음은 핸드폰 인증이나 해보자.
'웹 개발' 카테고리의 다른 글
[장고] 회원가입 기능 상세하게 마무리 (이메일 인증) (0) | 2024.03.08 |
---|---|
[장고] JWT 사용하기 #4 (0) | 2024.02.10 |
[장고] 장고로 JWT 사용하기 #3 (1) | 2024.01.31 |
[장고] 회원가입 DRF이용하여 만들기 #2 (0) | 2024.01.30 |
[장고] 프로젝트 Model 작성하기 #1 (1) | 2024.01.29 |