-
Django 이메일 인증으로 비밀번호 찾기 기능 구현(SMTP)Django 2022. 4. 7. 15:11
일단 아래와 같은 순서로 구현한다.
1. 이메일로 보내는 랜덤 코드 만들기
2. Django EmailMessage 모듈을 이용하여 랜덤 코드 Message 보내기 (user DB에 같은 코드를 보낸다.)
3. 랜덤 코드 확인하기
4. 비밀번호 변경하기
settings.py
SMTP를 사용하기위해 settings.py 맨 밑에 아래 코드를 추가해준다.
SMTP에 관한 내용은 따로 알아보는 것을 추천한다.
그리고 SMTP를 사용하기 위해서 아래 링크에 접속하여 보안 수준이 낮은 앱 허용: 사용을 활성화 시킨다.
https://myaccount.google.com/lesssecureapps
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.gmail.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = "GMAIL 계정" EMAIL_HOST_PASSWORD = "위 메일의 password"
services.py
view함수의 가독성을 위해 service함수를 따로 정리했다.
일단 아래 코드를 import 해준다.
email을 보내기 위해 Django에서 제공하는 EmailMessage 라이브러리를 사용했다.
Django 공식 홈페이지에서 한 번 읽어보는 것을 추천한다.
user모델은 본인 각자의 user모델을 불러온다.
from django.core.mail import EmailMessage from users.models import UserModel import string import random
랜덤 코드를 생성하는 함수이다.
길이는 8자로 숫자와 영어를 랜덤으로 조합하여 코드를 생성한다.
def make_email_auth_code(): LENGTH = 8 string_pool = string.ascii_letters + string.digits auth_num = "" for i in range(LENGTH): auth_num += random.choice(string_pool) return auth_num
이메일을 보내는 함수이다.
email을 인자로 받아 받아온 email과 같은 유저가 있으면 그 유저에게 email을 보낸다. 동시에 user DB의 email_code 의 값을 message로 update 한다. (message는 위 함수에서 만든 랜덤 코드이다.)
code를 확인하는 함수에서 입력받은 code가 맞는지 확인하기 위해 DB에도 같은 코드를 저장한다.
email_code = models.CharField(max_length=50, blank=True, null=True) -> 유저 모델에 이 코드를 추가해준다.
mail_subject : 메일 제목
message : 메일 내용
to : 수신자
def send_email_auth_code(email): exist_user = UserModel.objects.filter(email=email).exists() mail_subject = 'bookin 인증 코드' message = make_email_auth_code() send_email = EmailMessage(mail_subject, message, to=[email]) if exist_user: UserModel.objects.filter(email=email).update(email_code=message) send_email.send() else: error = '이메일을 확인해주세요.' return error
보낸 email 코드를 확인하는 함수이다.
함수에서 받아온 email 인자와 같은 user 의 email_code를 가져온다.
받아온 code 인자와 email_code와 같은 경우 함수를 return 하고
같지 않은 경우 error 메세지를 return 한다.
def check_email_code(email, code): check_code_in_user = UserModel.objects.filter( email=email).values('email_code') if code == check_code_in_user[0]['email_code']: return else: error = '잘못된 코드입니다. 다시 입력해주세요.' return error
마지막 service 함수로 비밀번호 변경 함수이다.
code 확인이 완료되면 비밀번호 변경을 한다.
def reset_passowrd(email, password): user = UserModel.objects.get(email=email) user.set_password(password) user.save() return
Views.py
첫 번째 view 함수로 POST로 받아온 email을 send_email_auth_code의 인자로 넣어준다.
reponse.set_cookie('email', email_code)를 한 이유는 다른 이메일 인증 view 함수에서 입력받은 email이 계속 필요하기 때문에 cookie에 넣어줬다.
def email_authentication_view(request): if request.method == 'GET': return render(request, 'users/find_password.html') if request.method == 'POST': email_code = request.POST.get('email', '') authentication_message = send_email_auth_code(email_code) if authentication_message: return render(request, 'users/find_password.html', {'error': authentication_message}) response = redirect('/check-password') response.set_cookie('email', email_code) return response
email 코드를 확인하는 view 함수이다.
코드를 받은 email을 저장한 cookie에서 email 정보를 받아온다.
POST로 입력받은 code와 email을 check_email_code함수에 인자로 넣어준다.
def email_check_code_view(request): email = request.COOKIES['email'] if request.method == 'GET': return render(request, 'users/check-password.html') if request.method == 'POST': code = request.POST.get('code', '') check_email_message = check_email_code(email, code) if check_email_message: return render(request, 'users/check-password.html', {'error': check_email_message}) return redirect('/reset-password')
비밀번호 변경 view 함수이다.
마찬가지로 email을 쿠키에서 받아온다.
service함수의 reset_password 함수를 사용하여 받아온 email의 password를 변경한다.
그리고 이제 cookie의 email을 사용할 필요가 없기 때문에 cookie에서 삭제한다.
def reset_password_view(request): email = request.COOKIES['email'] if request.method == 'GET': return render(request, 'users/reset-password.html') if request.method == 'POST': new_password = request.POST.get('new_password', '') new_password2 = request.POST.get('new_password2', '') if new_password != new_password2: return render(request, 'users/reset-password.html', {'error': '잘못된 비밀번호입니다. 다시 확인해주세요'}) else: reset_passowrd(email, new_password) response = redirect('/sign-in') response.delete_cookie('email') return response
이메일 입력 페이지 코드입력 페이지 비밀번호 변경 페이지 'Django' 카테고리의 다른 글
기본 장고에서 JWT를 활용한 로그인 구현 (0) 2022.03.27 Django ninja JWT를 활용하여 로그인 구현 (0) 2022.03.14 Django allauth Google Login page가 바로 안보일 때 (0) 2022.02.26 Django Unit Test in VSCode (0) 2022.02.20 Poetry 와 package (0) 2022.02.20