장고를 통해 2단계 인증 - email verification - 을 구현해보려고 한다.
우선 인증에 필요한 패키지를 설치해 준다.
pip install django-allauth
이 다음 setttings.py 의 INSTALLED_APPS 에 아래 줄을 추가해준다.
django.contrib.sites', # 의존성 앱 : 여러 사이트 동시에 운영 가능
'allauth', # <- 추가
'allauth.account', # <- 추가
'allauth.socialaccount', # <- 추가
# 'allauth.socialaccount.providers.facebook', # <- 필요한 소셜 로그인 추가
site id 는 디폴트인 1 로 설정해줄 것이다.
AUTH_USER_MODEL = 'user.UserModel' # 내가 만든 유저모델 사용
SITE_ID = 1 # 1번 사이트 운영(기본값)
그 다음 백엔드에서 어떻게 auth 처리를 해줄 것인지 추가해준다.
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend', # <- 디폴트 모델 백엔드
'allauth.account.auth_backends.AuthenticationBackend', # <- 추가 : 특정한 방식으로 authentication 할 때 필요
)
이제 나머지 설정들을 settings.py 에 추가해준다.
settings.py
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = '587' # 포트 번호
EMAIL_HOST_USER = '이메일@gmail.com' # 내 이메일주소
EMAIL_HOST_PASSWORD = '앱 비밀번호' #발급한 앱비밀번호
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 1
ACCOUNT_EMAIL_SUBJECT_PREFIX = '[이메일 인증]' #이메일 제목앞에 붙일내용
예시
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
ACCOUNT_LOGIN_ATTEMPTS_LIMIT = 5
ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT = 300
SOCIALACCOUNT_AUTO_SIGNUP = False
ACCOUNT_SIGNUP_FORM_CLASS = accounts.forms.SignupForm
예시의 경우 사용자는 회원가입 시 이메일을 반드시 입력해야 하며, 이메일을 인증해야 한다. 회원가입 메소드는 account/forms/SignupForm 에서 구현된다. 또한 5번 로그인 실패시 300초 동안 로그인을 할 수 없게 된다.
이제 기본적인 설정을 마쳤으니 templates 을 고쳐주자
allauth 개발자의 깃허브에서 소스코드를 압축파일로 다운 받는다.
파일의 templates/accounts 에 가면 중요해보이는 html이 대부분 들어있다.
우선 base.html 에 내가 커스텀한 네비게이션 바를 추가해준다.