[Django/이메일 인증]

SooYeon Yeon·2022년 6월 26일
3

Django

목록 보기
12/20
post-thumbnail

이메일 인증

회원 가입 - 이메일을 입력 받아야 됨

회원정보를 DB에 저장 - is_active를 0으로 저장

is_active로 0으로 지정해주면 로그인을 할 수 없는 상태로 됨 (ex 휴면계정처럼)

(실제 회사같은 경우에는 회원탈퇴를 해도 혹시모를 상태에 대비해 저 active를 비활성화 시켜주는경우도 많음, delete하지않고)

메일 전송 - 파이썬 프로그램이 메일서버에 접속해서 메일에 전송 (메일서버가 필요함)

서버→클로 보낼때 사용자정보나 등등으로 만든 랜덤한 토큰값과 함께 전송하고 서버에서 저장해놓음, 밑에서 사용자가 링크를 확인했을 때 토큰값이 같아야만 허용

사용자가 받은 메일 - is_active를 1로 변경해주는 view함수를 호출하는 URL이 포함

is_active처리

signup에서 post일때 valid일때 save commitFalse다음에

user.is_active = False 추가

이메일 인증 구현하기

allauth 설치

pip install django-allauth

AbstractBaseUser -모델,인증방법까지 다 커스텀

AbstractUser - 모델정도만 바꾸기

이메일인증 안하면 로그인못하도록 할 것

settings.py 설정 추가

...

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'django.contrib.sites', # 여러사이트들 동시에 운영할수있음. 지금프로젝트는 1번사이트라고 설정(밑에서)
    'accounts',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
]
AUTH_USER_MODEL = 'accounts.User'
SITE_ID=1

AUTHENTICATION_BACKENDS = {
    # Needed to login by username in Django admin, regardless of `allauth`
    'django.contrib.auth.backends.ModelBackend',

    # `allauth` specific authentication methods, such as login by e-mail
    'allauth.account.auth_backends.AuthenticationBackend',
}

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
ACCOUNT_AUTHENTICATION_METHOD = 'email' # 유저네임은 말고 email로만 인증 할것임
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_EMAIL_VERIFICATION = 'mandatory' #none, optional(default, 보내긴하는데 인증하지않아도), mandatory(이메일인증받지않으면 로그인할수없다)
ACCOUNT_CONFIRM_EMIAL_ON_GET = True

...

https://django-allauth.readthedocs.io/en/latest/installation.html 참조

urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('allauth.urls'))
]
  • 회원가입하고 로그인하면 콘솔에 링크 뜨는데 그 링크떠서 confirm 하면 인증됨
  • db에서 SELECT * FROM test1.account_emailaddress; 로 확인해보면 인증한 사용자는 verify가 1로 되어있음
  • gamil imap smtp(서버가이용하는거) 등의 이메일 프로토콜있음

https://support.google.com/mail/answer/7126229?hl=ko#zippy=%2C단계-imap이-켜져-있는지-확인%2C단계-이메일-클라이언트의-smtp와-기타-설정-변경

https://myaccount.google.com/security?rapt=AEjHL4MGIx6LRjAydtUwChhgLoLEcJ1tkCI2AvrETcx8oIkOmDEnqFAvAF3smMIT5FggHxYCSLlOcQBD-zDrM9b7sxojj8dfZA

여기서 앱 비밀번호를 설정 (장고가 쓸 거)

settings.py에서 이렇게 추가

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = '587'
EMAIL_HOST_USER = 'xxxxxxx@xxxxxx' # 내 이메일주소
EMAIL_HOST_PASSWORD = 'xxxxxxxxxxxxxx' #발급한 앱비밀번호
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 1
ACCOUNT_EMAIL_SUBJECT_PREFIX = '[이메일 인증]' #이메일 제목앞에 붙일내용

sign up 하면

만약 메시지 보낼때 txt 바꾸고싶으면 공식문서의 내용처럼 templates밑에 저런 경로의 폴더를만든다

~~message.txt

안녕하세요 {{ user }} 회원님,
회원 가입 해주셔서 감사합니다.
아래 링크를 통해 절차를 진행 해주세요.
{{ activate_url }}

~~subject

[내 사이트] 이메일 인증

0개의 댓글