📘 DRF - 로그인,  로그아웃  

  1. 로그인
  2. 로그아웃

API 명세서를 기준으로 로그인, 로그아웃을 구현해 봅시다!

 

구현 과정은 얼마든지 바뀔 수 있어요!

# 저의 DRF 구현 순서
urls.py -> serializers.py -> views.py 

 

오늘 쓴 핵심 code

⚙️ 로그인

🌵  0. main/settings.py

더보기

 

추가했어요 ↓

'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',  # 인증된 사용자만 접근 가능
    ],
from datetime import timedelta
# JWT 토큰 관련 설정
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60),  # access token 유효 기간
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),  # refresh token 유효 기간
}

🌵  1. accounts/urls.py

더보기
path('login/', views.LogInView.as_view(), name="login"), # 로그인

🌵  2. accounts/serializers.py

더보기
# 로그인 serializer
class UserLogInSerializer(serializers.Serializer):
    username = serializers.CharField(required=True)
    password = serializers.CharField(required=True, write_only=True)
   
    def validate(self, data):
        user = authenticate(username=data['username'], password=data['password']) # authenticate()로 사용자 인증 수행
        if user is None: # 만약 user가 None이라면
            raise serializers.ValidationError("아이디 또는 비밀번호가 일치하지 않습니다.") # Error 메시지 보여주기
        data['user'] = user # user 정보를 validated_data에 저장
        return data

🌵  3. accounts/views.py

더보기
# 로그인 view
class LogInView(generics.GenericAPIView):
    serializer_class = UserLogInSerializer
    # ⬇️ main/settings.py에 REST_FRAMEWORK 부문에 정의해둠
    permission_classes = [permissions.AllowAny] # AllowAny : 인증되지 않은 사용자도 접근 가능
    
    def post(self, request):
        # get_serializer : generics에 있어서 굳이 import 안 해도 사용 가능 
        seriarlizer = self.serializer_class(data=request.data) # serializer_class 직접 사용
        seriarlizer.is_valid(raise_exception=True) # raise_exception=True : 유효성 검사 실패 시, 예외 발생
        user = seriarlizer.validated_data['user']
        refresh = RefreshToken.for_user(user) # JWT 토큰 생성
        return Response({
            'refresh': str(refresh),
            'access': str(refresh.access_token),
            }, status=status.HTTP_200_OK)

🔝

 

끝나지 않았어요 🙄

입력창이 사라지는 오류가 발생했어요

그래서 접근 가능하도록

permission_classes = [permissions.AllowAny]  # 모든 사용자가 접근 가능하도록 설정

 

코드를 추가하여서 문제를 해결했어요

 


⚙️ 로그아웃

🌵  1. accounts/urls.py

더보기
path('logout/', views.LogOutView.as_view(), name="logout"), # 로그아웃

🌵  2. accounts/views.py

더보기
# 로그아웃 view
class LogOutView(generics.GenericAPIView):
    permission_classes = [permissions.IsAuthenticated] # 로그인된 사람만 접근 가능
    
    def post(self, request):
        try:
            Refresh_token = request.data['refresh_token']
            token = RefreshToken(Refresh_token)
            token.blacklist() # 토큰을 블랙 리스트에 추가하여 해당 토큰이 더 이상 유효하지 않도록 함
            return Response({"message" : "로그아웃되었습니다."}, status=status.HTTP_205_RESET_CONTENT)
        except Exception as e:
            return Response({"error" : str(e)}, status=status.HTTP_400_BAD_REQUEST)

🔝

 


로그아웃 구현을 해야 하는데 안 나오더라고요 🤔
프런트앤드가 없으면 토큰을 사용하는 로그아웃은 작동이 잘 되는지 알 수가 없어요

그래서 postman으로 해보았습니다.

 

먼저 로그인을 진행하여 refresh와 access token을 받아주세요

그 뒤, logout에서 Headers에 Key로 Authorization을 추가하고 value에 Bearer access token을 입력한 후,

Body에 refresh token을 기입하고 Send를 눌러주시면?

"message" : "로그아웃되었습니다."
가 반환되는 걸 확인할 수 있었어요!

 


 

+ Recent posts