ks.dgoon.lee log

dboard - email 인증 활성화


2024/01/04 15:24:41 #django #dev #templates #bulletin board #dboard #django allauth

구글로그인은 프로덕션으로 바꾸려면 심사도 받고 귀찮은게 있어서, 일단 이메일 가입을 활성화 해두어 보기로 했다. 경험상 이메일 가입은 보안상 문제라거나, 운영상 문제라거나 여러가지 곤란한 이슈들이 생기니 가급적 없애는게 좋긴 하겠지만 지금이야 뭐 괜찮아.


1. urls 에 소셜로그인을 위해 필요한 패턴만 추가해 두었는데, allauth.urls를 모두 가져오도록 수정


2. site-packages 를 뒤져서 templates/account 를 내 프로젝트 디렉토리의 templates/account 로 복사해온다

    * 내 프로젝트 디렉토리를 먼저 찾으므로, 프로젝트 디렉토리에서 수정한게 적용된다.


3. 이제 가져온 템플릿들을 수정하면 된다. 기능상으로 보면,

    * 이메일 가입, 로그인: signup.html, login.html

    * 가입시 이메일 인증: verification_sent.html, email_confirm.html

    * 비밀번호 변경: password_change.html

    * 비밀번호 분실시 리셋: password_reset*.html

들이다. 일단 제일 위에 {% extends 'account/base.html' %} 부터 내 베이스파일로 바꿔주면 내 템플릿 안에 렌더링 되는걸 볼 수 있다. url 들 확인은 Debug=True 로 해두고 http://127.0.0.1:8000/account/ 를 열어보면 에러메시지와 함께 url 패턴들을 쫙 보여준다. (왜 Debug=True 로 프로덕션 올리면 안되는지 Okay?) 뚝딱뚝딱 고쳐보자...


4. 필요한 링크들을 내 템플릿 여기저기에 넣어준다.

    * 구글로그인 버튼 옆에 이메일 로그인 화면으로 가는 링크를 넣는다. {% url 'account_login' %}

    * 개인정보 화면에 비밀번호 변경화면으로 가는 링크를 넣는다. {% url 'account_change_password' %}

    * 가입 화면, 비밀번호 리셋화면 등등 기존 템플릿들 보면 쉽게 알 수 있다.


5. SMTP 설정을 넣어준다. 내가 개인적으로 돌리는 메일서버가 없기 때문에 구글님의 도움을 받았다.

    * 적당한 이름의 gmail 계정 생성 (noreply머시기머시기@gmail 이런걸로 했다)

    * 구글 계정 설정페이지로 가서 2FA 활성화

    * 2FA 활성화 페이지 제일 밑에 앱 비밀번호 생성하기

    * 하나 생성하고 화면에 뜬 앱 비밀번호를 적어둔다

    * django 설정파일에 smtp 설정을 넣는다. 대강 아래와 같은 설정. USERNAME, PASSWORD 를 적당히 바꿔준다.

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_USE_TLS = True
EMAIL_PORT = 587
EMAIL_HOST_USER = 'USERNAME'
EMAIL_HOST_PASSWORD = 'PASSWORD'
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
    * django 설정파일에 ACCOUNT_EMAIL_VERIFICATION = True 를 넣어준다. (이게 없거나 False 이면 이메일 인증 안함)
    * 이제 이메일로 가입해보자! confirm link 가 붙은 이메일이 날아온다. 링크 찍고 확인누르면 가입 가능.

6. 안 쓸 페이지들은 404로 막아버리자. 나는 'accounts/email/' 을 막았다. 저기로 가면 이메일 추가, 변경 등이 가능하다. 이메일은 unique username 으로 쓰게 해둬서 바뀌면 곤란함. 그리고, 비밀번호 변경 후에 그 페이지가 그대로 다시 뜨는게 이상해서 비밀번호 변경후 '/myinfo' 로 가도록 sucess_url 을 넣어주었다. 대략 아래 같은 식으로.
from django.views import defaults as django_default_views
from allauth.account import views as allauth_views
...
urlpatterns = [
    ...
    path('accounts/email/', django_default_views.page_not_found, {'exception': Exception()}),
    path('accounts/password/change/', allauth_views.PasswordChangeView.as_view(template_name='account/password_change.html', success_url='/myinfo'), name='account_change_password'),
    ...
]

7. done!



댓글 1개

2024/01/04 21:23:39 dgoon
AWS SimpleEmailService 에서 메일을 보낼 수 있도록 세팅을 해 두었다. 한도요청도 이미 해서 하루 5만개까지 보낼 수 있고, 내가 쓰려던 도메인이 이미 이메일 보낼 수 있게 확인도 되어 있었음. 언제 해뒀던거지 기억도 안난다... ㅎㅎ
gmail smtp -> aws ses smtp 로 변경!
⤷ 댓글을 작성해 주세요. 비밀번호는 나중에 댓글을 수정하거나 삭제할 때 필요합니다.