Django 이메일 확인 구현

3929 단어 django


Django는 일반적인 웹사이트의 거의 모든 사용자 관리 로직을 즉시 제공합니다. 사용자 로그인, 로그아웃, 비밀번호 변경, 비밀번호 재설정, 이 모든 것은 새 프로젝트를 시작하는 즉시 준비됩니다.

하지만 "거의"라고 말한 이유는 Django에서 제공하지 않는 거의 모든 웹사이트에 필요한 한 가지가 있기 때문입니다. 바로 이메일 확인입니다. 하지만 두려워하지 마세요. 기능이 즉시 제공되지 않을 수 있지만 필요한 모든 구성 요소가 있습니다.

토큰



이메일 확인 흐름에서 가장 중요한 부분은 확인 토큰입니다. 이 토큰의 목적은 사용자의 현재 상태를 인코딩하는 것입니다. 사용자가 비활성 상태인 경우에만 유효하기를 원합니다. 사용자가 활성화되면 토큰은 더 이상 유효하지 않습니다.

고맙게도 Django는 비밀번호 재설정 이메일을 보낼 때 유사한 토큰을 생성합니다. 이 클래스를 재사용하여 이메일 활성화를 위한 토큰도 만들 수 있습니다.

유일한 차이점은 토큰을 생성하는 데 사용하는 요소입니다. 사용자가 아직 활성화되지 않은 경우에만 토큰이 유효하기를 원하므로 user.is_active 를 포함합니다.

class EmailVerificationTokenGenerator(PasswordResetTokenGenerator):
    def _make_hash_value(self, user, timestamp):
        return (
                str(user.is_active) + str(user.pk) + str(timestamp)
        )

email_verification_token = EmailVerificationTokenGenerator()


email_verification_token_generator.py

확인 이메일



다음 단계는 확인 이메일을 보내는 것입니다.

활성화 URL을 구성하려면 다음 세 가지가 필요합니다.
  • 현재 도메인
  • Base64를 사용하여 인코딩하는 사용자 ID
  • 이전 섹션에서 논의한 토큰

  • class RegistrationView(FormView):
        # [...]
    
        def _send_email_verification(self, user: CustomUser):
            current_site = get_current_site(self.request)
            subject = 'Activate Your Account'
            body = render_to_string(
                'emails/email_verification.html',
                {
                    'domain': current_site.domain,
                    'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                    'token': email_verification_token.make_token(user),
                }
            )
            EmailMessage(to=[user.email], subject=subject, body=body).send()
    


    registration.py

    <div>
        <a href=
        "http://{{ domain }}{% url 'activate' uidb64=uid token=token %}">
        Please activate your account</a>
    </div>
    


    email_verification.html

    사용자 활성화



    마지막 단계는 사용자를 활성화하는 것입니다. 이전 단계에서 수행한 역 프로세스를 수행합니다.
  • Base64 디코딩으로 사용자 ID 가져오기
  • 사용자 ID를 사용하여 사용자 가져오기
  • EmailVerificationTokenGenerator를 사용하여 토큰이 여전히 유효한지 확인

  • 토큰이 유효하면 사용자가 아직 활성화되지 않았음을 의미하며 is_activeTrue로 설정하고 저장합니다. 이 시점부터 토큰은 더 이상 유효하지 않습니다. 따라서 템플릿에 적절한 메시지를 표시하기 위해 이 링크를 다시 클릭하는 경우를 처리해야 합니다.

    urlpatterns = [    
        path('activate/<uidb64>/<token>', 
             ActivateView.as_view(), 
             name='activate'),
         # [...]
    ]
    


    urls.py

    class ActivateView(View):
    
        def get_user_from_email_verification_token(self, token: str):
            try:
                uid = force_str(urlsafe_base64_decode(self))
                user = get_user_model().objects.get(pk=uid)
            except (TypeError, ValueError, OverflowError,
                    get_user_model().DoesNotExist):
                return None
    
            if user is not None \
                    and \
                    email_verification_token.check_token(user, token):
                return user
    
            return None
    
        def get(self, request, uidb64, token):
            user = self.get_user_from_email_verification(uidb64, token)
            user.is_active = True
            user.save()
            login(request, user)
            return redirect('registration_successful')
    
    


    activate.py

    바라건대 이것은 Django 프로젝트에서 이메일 확인을 구현하는 빠르고 간단한 방법이었습니다.

    즐거운 코딩하세요!

    좋은 웹페이지 즐겨찾기