될때까지

((WnB)) 6일차 : 로그인 데코레이터 포스트맨으로 테스트하기 본문

프로젝트/wecode2차 : WnB

((WnB)) 6일차 : 로그인 데코레이터 포스트맨으로 테스트하기

랖니 2022. 8. 6. 01:34
728x90

이제 로그인 데코레이터를 구현할 차례다. 코드는 지난 위스타그램 스터디때 작성했던 코드를 참고해서 작성했다.

import jwt

from functools          import wraps
from django.conf        import settings
from django.http        import JsonResponse

from users.models       import User

def signin_decorator(func):
    @wraps(func)
    def wrapper(self, request, *args, **kwargs):
        try:
            if 'Authorization' not in request.headers:
                return JsonResponse({'message':'KEY_ERROR'}, status=400)
            
            token        = request.headers.get('Authorization')
            payload      = jwt.decode(token, settings.SECRET_KEY, settings.ALGORITHM)
            user         = User.objects.get(id = payload['id'])
            request.user = user
            
            return func(self, request, *args, **kwargs)
            
        except User.DoesNotExist:
            return JsonResponse({'message':'INVALID_USER'}, status=400)
        
        except jwt.exceptions.DecodeError:
            return JsonResponse({'message':'INVALID_TOKEN'}, status=400)
    
    return wrapper

토큰의 경우 3가지 에러가 발생할 수 있고, 이를 고려해서 로직을 작성했다.

  1. Authorization = 토큰 이 담겨져 오는 데 Authorization이 없는 경우 => KEY_ERROR
  2. User가 존재하지 않는 경우 => INVALID_USER
  3. 우리가 생성한 토큰이 아닌 경우(토큰이 이상한 경우) => INVALID_TOKEN

 

작성한 데코레이터 기능을 테스트해보고 싶었다. 그래서 users.views에 TestView를 만들었다.

# users > urls.py

from django.urls import path

from users.views import TestView

urlpatterns = [
    path('/test', TestView.as_view()),
]
# users > views.py

class TestView(View):
    @signin_decorator
    def get(self, request):
        return JsonResponse({'message':'test'}, status=200)

 

 

만든 데코레이터를 포스트맨을 사용해서 테스트해보자.

users > views.py에서 작성한 메소드를 선택하고, uri를 입력한다.

Authorization탭에서 Type을 Inherit auth from parent로 선택한다.

Headers탭으로 이동해서 KEY에는 Authorization을 입력하고 VALUE에는 토큰을 복붙한다. 그러면 이제 테스트를 할 수 있다.

1. Authorization이 없는 경우 KEY_ERROR 발생
2. 제대로된 토큰을 보낸 경우 test 메세지 출력(뷰까지 연결 성공)
3. 이상한 토큰인 경우 INVALID_TOKEN 메세지 출력

 

이제 다음은 테스트 코든가......

728x90