Django 07

·2023년 9월 11일
0

파이썬

목록 보기
14/18

장고를 통해 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: 로그인 인증 방법으로 username, email, username_email을 지정할 수 있다. email로 설정할 때는 ACCOUNT_EMAIL_REQUIRED = True 옵션을 같이 설정해야 한다.
  • ACCOUNT_EMAIL_REQUIRED: 회원가입할 때 이메일 주소 입력 필수 여부이다. 디폴트 값은 False이므로 이메일 주소를 입력하지 않아도 가입된다.
  • ACCOUNT_USERNAME_REQUIRED: 회원 가입할 때 username 입력 필수 여부이다. 디폴트 값은 True이므로 반드시 ACCOUNT_AUTHENTICATION_METHOD를 통해 이메일로 로그인으로 설정하더라도 username을 입력해야 가입된다.
  • ACCOUNT_EMAIL_VERIFICATION: 이메일 유효성 인증이 필요한지 여부이다. 'mandatory', 'optional', 'none' 값을 지정할 수 있으며 'mandatory'는 회원가입 후 이메일 주소를 인증하지 않으면 회원가입하더라도 로그인할 수 없다. 'optional'은 인증 이메일은 발송되지만 인증하지 않아도 로그인할 수 있고 'none'은 인증 메일을 보내지도 않고 로그인할 수 있다.
  • ACCOUNT_LOGIN_ATTEMPTS_LIMIT: 지정된 횟수(기본값=5) 만큼 로그인 실패할 경우 ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT 설정값으로 지정한 시간(단위=초)만큼 로그인할 수 없다. allauth 로그인 뷰에서 적용되고 Django 기본 관리자 로그인 뷰에는 적용되지 않는다.
    ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT: 로그인 실패 시 다시 로그인할 수 없는 시간(기본값=300초)이다.
  • ACCOUNT_USER_MODEL_USERNAME_FIELD: 커스텀 사용자 모델을 사용하는 경우 아이디 필드의 이름이 username이 아닌 다른 이름일 경우 지정한다. 만약 None으로 지정할 경우 allauth에서 username과 관련된 모든 기능을 사용하지 않는다. 이 경우 ACCOUNT_USERNAME_REQUIRED 값 또한 반드시 False로 지정해야 한다.
  • ACCOUNT_USER_MODEL_EMAIL_FIELD: 커스텀 사용자 모델을 사용하는 경우 이메일 필드의 이름이 기본값 email이 아닌 다른 이름일 경우 지정한다. 만약 None으로 지정할 경우 allauth에서 email과 관련된 모든 기능을 사용하지 않는다. 이 경우 ACCOUNT_EMAIL_REQUIRED 값 또한 반드시 False로 지정해야 한다.
  • ACCOUNT_SIGNUP_FORM_CLASS: 회원가입 폼 클래스를 지정하고 해당 클래스는 def signup(self, request, user) 메소드를 반드시 구현해야 한다.
  • SOCIALACCOUNT_AUTO_SIGNUP: 디폴트 값은 True이며 SNS 공급자에서 넘겨받은 정보를 가지고 바로 회원가입시킨다. 부가정보를 입력 받기 위해 False로 설정할 수 있다.

예시

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 에 내가 커스텀한 네비게이션 바를 추가해준다.

profile
공부 중

0개의 댓글