카테고리 없음

Django JWT 간단한 로그인 기능

rlarudals 2024. 11. 20. 17:27

이전에는 회원가입을 만들었으니 로그인 기능을 간단히 만들어 볼것이다.

 

방법은 두가지 우선 가장 기초적인 방법

 

먼저 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"), # 리프레시 토큰