이전에는 회원가입을 만들었으니 로그인 기능을 간단히 만들어 볼것이다.
방법은 두가지 우선 가장 기초적인 방법
먼저 pip install djangorest-framework-simplejwt 해주기
이후에 pip freeze > requirements.txt 한번 해주고
views.py - 회원가입에서 비밀번호 해시화 기능을 추가하였다 user.set_password(request.data.get('password'))
from django.shortcuts import render
from django.contrib.auth import get_user_model
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated, AllowAny
from .serializers import SignupSerializer, SigninSerializer
from rest_framework_simplejwt.tokens import RefreshToken
from django.contrib.auth import authenticate
User = get_user_model() # 필수 지우면 안됨
# 회원가입
class SignupAPIView(APIView):
permission_classes = [AllowAny]
def post(self, request):
serializer = SignupSerializer(data=request.data) # 요청 데이터
if serializer.is_valid():
user = serializer.save()
user.set_password(request.data.get('password'))
user.save()
# serializer.save() # 데이터 저장
return Response({"message": f"{user.username}님 회원가입이 완료되셨습니다!"}, status=status.HTTP_201_CREATED)
return Response({"message" : "회원가입에 실패하셨습니다"}, status=status.HTTP_400_BAD_REQUEST)
# 로그인
class SignInAPIView(APIView):
permission_classes = [AllowAny]
def post(self, request):
username = request.data.get("username") # 유저네임 불러오기
password = request.data.get("password") # 비밀번호 불러오기
user = authenticate(request, username=username, password=password) # 맞는지 확인
if user is not None:
serializer = SigninSerializer(user)
data = serializer.data
# jwt token
refresh = RefreshToken.for_user(user)
refresh_token = str(refresh)
access_token = str(refresh.access_token)
data["access_token"] = access_token
data["refresh_token"] = refresh_token
return Response({"message":f"{user.username}님 로그인을 성공하였습니다!", "data" : data}, status=status.HTTP_201_CREATED)
return Response({"message" : "로그인에 실패하셨습니다"}, status=status.HTTP_400_BAD_REQUEST)
serializers.py
# 로그인
class SigninSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ["username", "password"]
결과

이것보다 더 간단한 방법
urls.py 에 이것 두줄만 추가하면 된다.
path("login/", TokenObtainPairView.as_view(), name="token_obtain_pair"),
path("token/refresh/", TokenRefreshView.as_view(), name="token_refresh"), # 리프레시 토큰
