프로젝트를 진행하면서 회원가입/로그인/로그아웃 외로 [비밀번호 재설정] 기능 구현을 하고 싶었다.
일반적으로 장고 admin에서 비밀번호 변경 가능하지만, 웹사이트 사용자는 어떻게 비밀번호를 재설정할 수 있을까? 장고 공식홈페이지에 관련 내용이 잘 나와있지만.. 역시 공홈은 공홈...
장고 공식홈페이지 + 무수한 구글링 + 무수한 삽질 = 오늘의 포스팅 😇
필자 보다 덜 삽질하길 바라며 이 글을 작성해 본다.
보통 웹사이트 회원가입을 위해 사용자에게 요구하는 몇 가지 기본 정보가 있다.
이름(닉네임),이메일,비밀번호 여기서 사용자 [이메일]을 가지고 [장고 인증 URL]을 사용해 보자.
아래 장고 공식 문서를 보면 ,
password reset| Django documentation | Django
[Authentication Views] 장고에서 제공하는 URL은 8개가 있다. 그 중 마지막 4개의 URL만 사용하여 [비밀번호 재설정]을 진행해보자.
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']
장고에서 기본으로 제공하는 URL 사용하기 위해 urls.py에 아래같이 입력한다.
from django.contrib.auth import views as authViews
urlpatterns = [
path('password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'),
path('password_reset_done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'),
path('password_reset_confirm/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
path('password_reset_complete/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
]
‘password_reset/’ 에 접근할 수있도록 login.html 파일에 a 태그로 연결해준다.
<a href="/password_reset/" class="btn btn-secondary">비밀번호 분실/변경</a>
[SMTP backend] SMTP 서버를 통해 이메일 보내기
SMTP 서버를 통해 이메일 전송하기 위해 settings.py에서 아래같이 작성한다.
(아래는 gmail로 보내는 방법입니다. 네이버, 다음 등 포트 번호, 인증 등등.. 다를 수 있습니다)
# settings.py
# EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
# console은 터미널에 보낸 메일 내용을 보여준다.
# 아래처럼 smtp로 작성해야 메일 전송 된다.
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_PORT = '587'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'mommyson뭐시기@gmail.com' # 발신할 이메일(이 부분만 변경)
EMAIL_HOST_PASSWORD = 'mommyson뭐시기' # 발신할 메일의 비밀번호(이 부분만 변경)
EMAIL_USE_TLS = True # TLS 보안 방법
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
여기까지 작성해 주면 끝! 성공했다면 장고에서 기본으로 제공하는 비밀번호 재설정 URL 타고 장고 admin에서 본 화면과 동일한 화면을 보여준다!
‼️보안 문제로 메일 전송을 못할 수 있다. settings.py에 입력한 바로 그 메일에서 아래 블로그처럼 [gmail 보안 설정] 해준다. -> django SMTP gmail 보안 설정
🤔 여기까지 구현한 것도 의미있지만.. 사용자에게 보여주기에는 너무 속 알맹이를 보여주는 느낌이라 영... 마음에 안든다. 내가 만든 사이트에서 작동하는 것처럼 통일감을 주고 싶다! 그렇다면 몇 번의 스텝으로 내 사이트와 동일한 느낌의 비밀번호 재설정 URL 만들 수 있다.
장고에서 제공하는 URL 화면 대신 사용할 templates 파일을 생성한다
password_reset.html : 기존 사용자와 연결된 이메일을 요청하는 이메일 양식과 연결
password_reset_done.html : 비밀번호 재설정 이메일이 전송되었다는 메시지 표시
password_reset_confirm.html : 사용자의 새 비밀번호를 요청하는 양식
password_reset_complete.html : 사용자에게 새 비밀번호로 로그인하고 알림
templates HTML 코드는 아래 링크처럼 작성한다. 아래 링크에서 많은 도움을 받았다.
https://ordinarycoders.com/blog/article/django-password-reset
‼️위 링크 내용 중에 templates password_reset.html 에서 {{ password_reset_form|crispy }}
→ {{ form|crispy }}
으로 변경해 주자.
crispy
사용하려면 패키지를 설치해줘야한다. 터미널 - settings.py
# 터미널
pip install django-crispy-forms
settings.py 아래같이 작성.
# settings.py
INSTALLED_APPS = [
...,
'crispy_forms',
]
CRISPY_TEMPLATE_PACK = 'bootstrap4'
crispy 패키지를 사용하기 위한 templates 기본 구성
<!-- crispy 패키지를 사용하기 위한 templates 기본 구성 -->
{% load crispy_forms_tags %}
{% csrf_token %}
{{ form|crispy }}
crispy가 궁금하다면 -> Django Crispy Forms || what are they about?
앞에서 작성했던 urls.py에서 우리가 만든 templates 파일을 연결해 준다
from django.contrib.auth import views as authViews
urlpatterns = [
path('password_reset/', auth_views.PasswordResetView.as_view(template_name='password/password_reset.html'), name='password_reset'),
path('password_reset_done/', auth_views.PasswordResetDoneView.as_view(template_name='password/password_reset_done.html'), name='password_reset_done'),
path('password_reset_confirm/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(template_name='password/password_reset_confirm.html'), name='password_reset_confirm'),
path('password_reset_complete/', auth_views.PasswordResetCompleteView.as_view(template_name='password/password_reset_complete.html'), name='password_reset_complete'),
]
🎉 장고 인증 URL 활용편 끝!
지금까지 잘 따라왔다면 장고에서 기본으로 제공하는 화면이 아닌 내가 설정한 화면에서 비밀번호 재설정 URL 기능을 사용할 수 있다
포스팅 끝 : )