지난에 생성한 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. 회원가입 결과


- 비밀번호가 암호화 되어 저장되었다.
- 같은 이메일, 닉네임으로 회원가입

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


다음 편에서는 마지막으로 로그인, 로그아웃을 구현해볼 것이다..!
<참고>
[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
'Django' 카테고리의 다른 글
| [Python] package 목록 관리 (requirements.txt) (6) | 2023.10.05 |
|---|---|
| [Python] 가상 환경이란? (Virtual Environment) (1) | 2023.10.05 |
| [Django] DRF JWT 인증 방식을 이용한 회원가입 & 로그인 (3. 이메일 로그인/로그아웃) (4) | 2023.09.01 |
| [Django] DRF JWT 인증 방식을 이용한 회원가입 & 로그인 (1. User Custom) (3) | 2023.08.18 |
| Django - mariaDB (MySQL) 연동하기 (3) | 2023.07.26 |