Django

[Django] DRF JWT 인증 방식을 이용한 회원가입 & 로그인 (2. 이메일 회원가입)

오늘 할 일을 내일로 2023. 8. 18. 18:25

지난에 생성한 custom User를 사용하여 회원가입을 구현해보자. 앞서 말했던 것처럼 email을 이용한 회원가입, 로그인을 진행할 예정이다.

 

 

1. Signin API 작성

accounts/views.py 

import jwt
from django.contrib.auth import authenticate
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer, TokenRefreshSerializer

from accounts.models import User
from accounts.serializers import UserSerializer
from my_settings import SECRET_KEY


# 01-01 이메일 회원가입
class SigninAPIView(APIView):
    def post(self, request):
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            user = serializer.save()

            # JWT 토큰
            token = TokenObtainPairSerializer.get_token(user)
            refresh_token = str(token)
            access_token = str(token.access_token)
            res = Response(
                {
                    "user": serializer.data,
                    "message": "Signin Success",
                    "token": {
                        "access": access_token,
                        "refresh": refresh_token,
                    },
                },
                status=status.HTTP_200_OK
            )

            res.set_cookie("access", access_token, httponly=True)
            res.set_cookie("refresh", refresh_token, httponly=True)

            return res
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

사용자로부터 데이터를 받으면 serializer을 통해 정보를 받는다. 유효성이 검증된 데이터라면 user를 저장하고 해당 user에 대한 JWT token을 발급 받고 토큰은 쿠키에 저장된다. 

 

 

JWT와 쿠키에 대한 이야기는 후에 다시 정리할 예정이다. 

 

2. url 연결

accounts/urls.py

rom django.urls import path, include

from accounts.views import SigninAPIView

urlpatterns = [
    path('signin/', SigninAPIView.as_view()),
]

 

+) bcrypt 설치

pip install bcrypt

bcrypt는 비밀번호를 암호화하는 기능을 갖고 있다. bcrypt를 설치하면 DB에 유저가 저장될 때, user의 비밀번호가 자동으로 암호화되어 저장된다. 

 

사실 회원가입만 구현하는 지금은 필요가 없을 수도 있으나, 후에 있을 로그인 구현 때, 오류를 방지하고자 미리 다운로드를 한 후 회원가입을 진행하는 것이 좋다. 

 

 

 

3. 회원가입 결과

새로운 계정 생성

 

회원가입 성공

- 비밀번호가 암호화 되어 저장되었다. 

 

 

- 같은 이메일, 닉네임으로 회원가입

같은 이메일, 닉네임으로 회원가입 불가

 

- 이메일을 입력하지 않은 경우

 

회원가입 실패

 

다음 편에서는 마지막으로 로그인, 로그아웃을 구현해볼 것이다..!

 

 

<참고>

https://velog.io/@kjyeon1101/DRF-JWT-%EC%9D%B8%EC%A6%9D%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%9C-%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85%EB%A1%9C%EA%B7%B8%EC%9D%B8

 

[DRF] JWT 인증을 사용한 회원가입&로그인

작년에 멋사에서 이음 프로젝트를 하면서 가장 절실하게 깨달았던 점.. 유저는 무조건 시작단계에 해놔야 한다. 다른거 다 만들고 유저를 만들거나 고치려고 하면 너무 복잡하게 얽혀있어서 공

velog.io

https://stackoverflow.com/questions/55571170/django-check-password-always-returning-false

 

Django check_password() always returning False

I have an existing database that is used with NodeJs application, now same database will be used for new application that is built with Django. I have an user_account table, which stores user login

stackoverflow.com