티스토리 뷰

728x90
반응형

[ 인트로 ] 

오늘 오후 3시쯤

애플 쪽으로 개발자님 메일주소를 공유받았다면서 비밀번호 초기화를 하고 싶다는 메일을 받았다. (비밀번호를 잊으셔서 다시 로그인을 못하는 상황이셨다)

 

개인 앱이지만

앱에 문의할 수 있는 이메일도 안남겨놓고

계정이 있는 앱이라면 필수인 아이디 찾기, 비밀번호 재설정, 탈퇴하기도 안붙인 내 자신이 너무 부끄럽고 죄송스러웠다,,, 

 

양파가족을 너무너무 잘쓰고 있고 얼른 다시 재개하고 싶다는 메일을 보고 

저녁약속 전 무조건 대응해드리고 간다 🔥🔥 라고 생각하고 가장 빠른 방법으로 대응해드렸고 기록을 남긴다. 

 

(이렇게 주절주절 쓰는 이유는 Django의 기본 기능이 너무 잘되어있고 간편해서 이런 급한 상황에서도 빨리 적용할 수 있다는 것을 강조하고 싶어서이다,,,)  

 

(사실 처음부터 이런 일이 없도록 필수 기능을  다 붙여서 출시하는 것이 중요하다,,,🥲)

 

[ Django 비밀번호 변경 살펴보기 ] 

 

장고 문서 를 보면

Django는 사용자가 자신의 암호를 변경할 수 있도록 하는 기능을 제공하는 것을 알 수 있다. 

 

https://docs.djangoproject.com/ko/3.1/topics/auth/default/

 

저 주황네모에서 보기(views)를 눌러서 들어가보면

password reset 관련된 url pattern을 확인할 수 있다. 

 

https://docs.djangoproject.com/ko/3.1/topics/auth/default/#built-in-auth-views

 

여기서 password reset이란 Django의 User Model에는 email 필드가 있는데

사용자가 가입할 때 입력한 email로 비밀번호를 초기화할 수 있는 링크를 보내주는 것을 말한다.

 

그럼 저 네모친 url이 어떤 역할을 하는 지 하나씩 살펴보자

 

1. password_reset/  

 

이메일로 password reset link를 발송할 수 있는 화면이다.

 

 

password reset link를 보낼 User의 email을 입력하면 된다.

User Model의 email 필드에서 확인할 수 있다.

 

 

 

 

2. password_reset_done/

 

위에서 Reset my password를 버튼을 누르면 나오는 화면이다.

 

 

3. password_reset_confirm/<uidb64>/<token>/  

 

사용자에게 발송되는 링크 형식이다. 

 

 

사용자가 위의 링크를 클릭하면 여기서 비밀변호 변경을 할 수 있게 된다. 

 

 

참고로 저 링크에서 한번 비밀번호를 바꾸고 

다시 링크로 접속하면 입력 폼이 아니라 이 링크가 이제 invalid하다는 메세지가 나온다. 

 

 

4.  password_reset_complete/

 

3에서 change my password를 누르면 나오는 화면이다. 

 

 

 

[  Password reset url 설정 ] 

 

이제 위의 password reset 관련 url들을 설정해보자

아래 path들을 넣어주면 된다. 

   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'),

 

제 프로젝트에는 계정관리 담당(?) account app이 있는데

account > urls.py에 이렇게 추가해주었습니다. 

 

 

 

[ SMTP 설정 ] 

여기까지 하고 

password_reset/에 접속해서 Reset my password 버튼을 누르면 이메일을 못보내고 에러페이지로 이동하는 것을 볼 수 있다.

 

장고의 email 문서를 참고해서 SMTP 설정을 해줘야한다. 

 

 

 

# gmail

예를 들어 나의 gmail계정을 메일의 발신자로 할 것이라면

여기 블로그를 참고해서 구글 계정 설정을 해주고 (구글 계정 설정에서 해야하는 것을 스샷으로 첨부해준 좋은 블로그임당,,)

 

settings.py를 아래와 같이 설정해주면 된다. 

 

 

# naver

만약 나의 naver 계정을 메일의 발신자로 할 것이라면

네이버 메일 > 환경설정 에 가서 

사용함을 체크해주고 

 

 

settings.py를 아래와 같이 설정해주면 된다. 

 

 

 

(비밀번호 숨기는 방법은  secrets.json 파일 만들기 를 봐주세요)

 

 

[ 회원가입할 때, 이메일을 꼭 받자 ]

 

Django의 User Model에는 username, email, password 등의 필드가 있다.  

(이 세개의 필드는 create superuser 할 때 장고에서 물어보는 필드이다. 로그인할 때 email은 필요없는데 왜 꼭 물어보지..? 했는데 이유를 알게 되었다.)

 

나는 username, password만 설정해주도록 구현을 해서

문의주신 분의 email을 이번에 User의 email 필드에 직접 넣고 password reset link 보내기를 진행했다. 

 

회원가입할 때, 처음부터 email을 입력받도록 했으면

'가입하실 때 설정하신 email로 비밀번호 재설정 메일이 갑니다.' 하면서 비밀번호 재설정 기능을 붙이기 더 쉬웠을 텐데 아쉽다,, 

 

그리고 가입할 때 email을 받는다면 email 인증 로직도 추가해야한다. (참고: Django 회원가입 이메일 인증(SMTP))

이 로직은 password_reset과 달리 직접 추가해야하는 것 같다. 

 

 

[  회사메일을 발신자로 하기  ]

개인앱이지만 개인계정 말고 회사계정 만든 후, 회사계정을 발신자로 해서

비밀번호 reset link를 보내는 것이 좋습니다. 

 

근데 gmail 비즈니스 이메일은 유료여가지구,, 

저는 onionfamily.official@gmail이라는 개인계정(무료) 만들어서 발신자 설정해줬습니다..! 

 

 

 

 

[ reset link가 https가 아니라 http로 갈 때 ]

 

만약 reset link가 http로 간다면

settings.py에 이 설정을 추가해주시면 됩니다! 

SECURE_SSL_REDIRECT = True

 

그럼 https 링크로 보내집니다

 

 

 

[ SMTPAuthenticationError 가 발생한다면 ]

 

여기 답변을 참고해주세요!

 

https://stackoverflow.com/questions/35651001/gmail-smtpauthenticationerror-when-i-attempt-to-send-email-via-django

 

Gmail SMTPAuthenticationError when I attempt to send email via django

I'm using django-registration-redux and the forget password reset dialogue is working on my machine but it fails on the server. I get an SMTPAuthenticationError even though the local server is send...

stackoverflow.com

 

저는 https://accounts.google.com/b/0/DisplayUnlockCaptcha 여기서 액세스 허용을 안해서 에러가 발생한 적 있습니다.

 

 

[ Reference ]

 

gaebyeokja.tistory.com/10

 

Django) User 아이디 찾기, 비밀번호 찾기(초기화) 페이지 만들기

회원가입, 로그인, 로그아웃의 기능을 갖추었다면, 가입한 회원이 자신의 아이디, 비밀번호를 찾을 수 있는 기능이 필요하다.. Django는 물론 비밀번호 찾기를 지원한다. 하지만 이걸 다루는 글을

gaebyeokja.tistory.com

 

integer-ji.tistory.com/274

 

django SMTP gmail 설정 및 테스트

해당 글은 아래의 사이트를 보며 학습하였으며 추가적인 보안 및 자세한 설명을 추가하였습니다. https://yuda.dev/207 Django에서 지메일 보내기 "지메일을 사용한다는 가정 하에" settings.py EMAIL_HOST = "

integer-ji.tistory.com

 

 

 

728x90
반응형
댓글
  • 프로필사진 싸피초보 안녕하세요, 선생님 블로그를 보고 django 에서 구현을 하였습니다. 메일도 보내지고, url 접속하여 비밀번호 다시 설정까지 하였지만, 정작 서버에 바뀐 비밀번호가 적용이 되어있지 않습니다.. 어떤것이 문제일까요? [23/Sep/2021 18:02:40] "GET /accounts/password_reset_complete/ HTTP/1.1"
    200 1451 라고 서버에 뜹니다만.. 다른 요청은 모두 하늘색 초록 빨강으로 오는데, 이 바뀐 요청만 흰색으로 오더라구요. (VSCODE 에서 익스텐션사용중입니다) 어떤것이 잘못되었을까요? 비밀번호 변경이 되었는데 서버에 적용이 안됩니다..ㅜㅜ
    2021.09.23 18:20
  • 프로필사진 사용자 eungding 안녕하세요! 제가 이 댓글을 이제야 발견해서 너무 늦게 답변드립니다ㅠㅠ 지금은 해결되셨을까요?!
    2021.11.23 23:22 신고
댓글쓰기 폼