REST API - 회원가입 이메일 인증

Django에서 폼과 뷰를 사용해서 회원가입 시 이메일 인증을 하는 방법을 지난 포스트에 작성했었다.

그렇다면 API를 작성하려고 할 때는 어떤식으로 작성을 해줘야 원하는 대로 작동을 하려나.

일단 새로운 테스트 프로젝트를 만들고, 그 안에 email을 username으로 받도록 하는 유저모델을 새로 작성하도록 한다.

# user/models.py



유저모델을 자신이 원하는대로 다시 정의하고 싶다면, AbstractUser 모델을 상속받아서 원하는 대로 고쳐서 사용 할 수 있다. 여기서는 email 필드를 유니크하게 만들었고, USERNAME_FIELD로 지정함으로써 email을 사용해서 로그인 할 수 있도록 만들었다.

그리고 UserManager를 사용해서 username 대신 email을 가지고 유저를 생성하도록 해두었다.
username은 사용하지 않지만 유저 이름을 저장해둬야 해서 name필드를 새로 생성하였다.

# user/urls.py


urls 는 API 뷰를 호출한다는 것 말고는 이전과 같다

# user/views.py


UserRegistrationAPI 에서는 CreateAPIView 를 사용했다.
이 뷰는 Create기능만 담당하는 뷰라서 자동으로 Post만 처리해준다.
회원가입은 그저 이메일, 이름, 비밀번호만 받아서 포스트로 전송하는 일을 하기때문에, 다른 메서드는 필요가 없다고 본다.
이렇게 UserRegistrationAPI를 호출하면 다음 시리얼라이저를 사용한다.


유저모델에서 이메일, 이름, 비밀번호 필드를 전달받는다. Post메서드이기 때문에 이 인자들을 필수로 전달해줘야 정상적인 응답을 받을 수 있다.
그리고 이 시리얼라이저에서 이전에 뷰에서 했던 인증 이메일 전송 기능을 담당하게 된다.


이 함수들은 입력받은 이메일, 패스워드를 검사하는 부분이고 이 부분을 무사히 넘어가게 되면



나오는 이 부분이 새로운 유저를 생성하면서 인증 이메일을 전송하는 부분이다. 이전 포스트에서 뷰에서 작성한 것과 비교하면 전달받은 인자를 가져오는 부분 정도가 다르고 나머지는 같다.

회원가입 페이지로 접속하게 되면
장고에서 제공하는 화면으로 회원가입을 해볼 수 있고, 회원가입을 진행하면

이렇게 인증 메일이 전송된다.

이 인증링크를 클릭하게 되면


아까 작성해 두었던 UserActivate 뷰에 의해서 다음과 같이 status 200_OK가 반환된다.
이 링크는 한번만 동작하게 되고, 그 이후로는 사용할 수 없기때문에 400 BAD_REQUEST가 반환된다.

정상적인 응답이 오게되면 로그인 페이지로 이동 한 후 다시 로그인을 요청한다.
JWT를 사용할 것이기 때문에 React에서 rest-auth로 요청을 보내서 사용한다.
rest-auth를 사용하는 과정에서, 로그인 부분에 username 대신 email을 사용할 것이기 때문에 설정 파일에 다음의 설정을 해준다.



이렇게 API를 생성하였고, 나중에 이를 가지고 React에서 인증 관련 부분을 구현하려 한다.

댓글

  1. 지금 코드는 django 에서만 작동하고
    다른 프론트엔드(말씀하신 react) 부분 연동은 안보이는데
    혹시 django 를 react 와 연동 해서 작성할때 django 에서 작성되는 부분은 달라지나요?

    답글삭제
  2. 안녕하세요 좋은글 잘봤습니다.
    해당글 따라해 보고 싶은데
    UseRegistrationSerializer(serializers.ModelSerializer):
    def validate_email(self, value):
    def validate_password(self, value):
    def create(self, validated_data):
    를 각각 어디에서 사용하는지 알 수 있을까요?
    폴더 및 파일 구조가 안나와서 어디에서 사용하는지 알기가 힘드네요
    api 만 있는 걸 찾다보니 작성핫니 api를 사용하고 싶어서 그렇습니다.

    답글삭제

댓글 쓰기