마이의 개발 블로그

[Django] Auth0에서 이메일 인증 여부(email_verified) 체크하기 본문

개발지식/Django

[Django] Auth0에서 이메일 인증 여부(email_verified) 체크하기

개발자마이 2023. 1. 2. 15:18
반응형

현재 수행 중인 프로젝트는 Auth0라는 서비스를 연결하여 로그인 기능을 구현하고 있다.

 

개발요구사항 중 유저의 이메일 인증여부를 확인하여 인증이 아직 안 된 경우 메인화면 이외의 페이지에 접근을 제한해달라는 내용이 있어, Auth0에서 제공하는 email_verified 필드를 활용한 예제를 제시해보려고 한다.

 

email_verified 필드에 관한 설명은 Auth0 공식문서에서 살펴볼 수 있는데 간단히 요약해보면,

 

1) Auth0를 통해 회원가입 시, 입력된 주소로 이메일 인증링크를 발송함

2) 인증링크를 클릭하여 이메일 인증을 완료했는지 여부를 email_verified 필드를 통해 알 수 있음

3) email_verified 필드의 사용은 optional임

 

나는 유저가 로그인할 때마다 이메일 인증 여부를 업데이트하여 user 테이블에 저장하고, 진입이 제한되어야 하는 메뉴들에 접근 시 테이블에 저장된 email_verified 컬럼을 체크하는 decorator를 추가하여 사용하는 방식으로 이 필드를 활용했다.

 

절차

1. User 모델에 email_verified 필드 추가

class User(AbstractUser):
	...
	email_verified = models.BooleanField(default=False)

2. Auth0 클래스에서 로그인 후 user에 email_verified 리턴되도록 설정

class Auth0(BaseOAuth2):
    def get_user_details(self, response):
        ...
        return {
        	...
            "email": payload["email"],
            "email_verified": payload["email_verified"]
        }

3. decorator 작성

# 이메일 인증여부 확인
def email_verification_required(function):
    def wrap(request, *args, **kwargs):
        if request.user.email_verified is True:
            return function(request, *args, **kwargs)
        messages.info(request, "이메일 인증이 필요합니다")
        return redirect("somewhere")

    return wrap

4. 진입을 제한하고자 하는 뷰에 decorator 추가

@login_required
@email_verification_required
def user_mypage(request):
	...
반응형
Comments