이메일 인증 방식으로 회원가입

회원가입 시 입력한 이메일 주소로 전송된 인증 링크를 확인해야지 회원가입이 되도록 구현해보자.











settings.py 에서 다음과 같이 이메일 서버 설정을 해주고

# urls.py

urls.py 에 다음과 같이 경로를 지정해준다. 
signup을 통해서 회원가입을 진행하게 되면, 인증 이메일을 전송하게 되고,
전송된 인증 링크를 통해 요청이 들어오면 activate가 반응하여 회원가입이 완료되고 
유저가 활성화 된다.

# views.py

views.py / signup

회원가입 뷰를 살펴보면, 폼을 입력받아서 POST 요청이 들어오면 commit = False 옵션으로 저장한다.
* commit = False : 실제 DB에 저장하지 않는 옵션
그런다음 생성한 유저를 is_active = False 를 통해서 비활성화 시킨다.
그 후에 유저 정보를 저장하게되면, 유저는 생성되지만 활성화 되지 않아서 사용할 수 없게된다.
그 다음 부분이 이메일 인증의 중요한 부분이다.
get_current_site(request) : request를 보낸 url경로를 가져온다.
message : 
    current_site.domain : 가저온 url 경로에서 도메인 주소만 추출.
    user : 비활성화 되어 생성된 유저정보
    uid : 생성된 user의 pk를 가지고 바이트정보로 변환후 base64 인코딩을 진행해서 인증코드의 한 부분을 생성
    token : 별도로 생성한 토큰 생성 함수를 통해서 생성된 유저정보로 인증코드의 또 한 부분을 생성
    # tokens.py

    
    장고에서 제공되는 토큰 제너레이터에서 해시를 만드는 부분에서 is_active를     포함 시키는것으로 오버라이팅 한다.
message를 생성할 때 사용한 render_to_string 은 지정한 템플릿으로 변수들을 렌더링 해서 
템플릿에서 출력되는 것들을 string으로 반환하는 것.
'acc_activate_email.html'

이렇게 생긴 템플릿인데, message = render_to_string 에서 전달하는 인자들을 다 사용하고 있다.
이 부분을 인증 이메일을 전송 할 때 메세지 부분으로 보낸건데, 이를 전달받게되면

이메일로 다음과 같이 전송된다. 그래서 저 링크를 클릭하면 activate 뷰를 수행하게 되는것.

활성 인증 링크를 클릭하게 되면 아래의 url 경로와 일치하게 되고, views/activate 함수를 수행하게 된다.
views.py / activate 

message를 보낼 때 토큰을 만든 방식을 반대로 수행하여 유저정보를 얻어오고 있다.
uid에 유저의 pk 가 들어갔었기 때문에 그를 가져와서 활성화 할 유저 정보를 얻어오고 있다.

check_token 부분은 앞서서 이메일을 보낼 때 토큰을 생성 한 것의 반대. 
즉 토큰의 유효성 검사부분

토큰 유효성 검사를 통과하면, 유저를 활성화 하고 완료 화면을 출력해준다.

댓글