오설록 클론 코딩을 하면서 데코레이터를 사용해 보게 되었다.
개념부터 찬찬히 훑어보고 코드를 짜려고 정리를 해보았다.
TimeStamp모델을 위해 만들었던core
라는 앱에 utils.py
에 파일을 따로 생성해주었다.
#먼저 모듈들을 import해준다.
from django.http import JsonResponse
from users.models import User
from django.conf import settings
def login_decorator(func):
def wrapper(self, request, *args, **kwargs):
try:
access_token = request.headers.get('Authorization')
#HTTPRequest의 헤더인 Authorization의 값을 가져온다.
payload = jwt.decode(access_token, settings.SECRET_KEY, settings.ALGORITHM)
#토큰을 디코딩하면 나오는 사용자 정보이다. 디코딩에 사용되는 SECRET_KEY, ALGORITHM이 토큰 발행 시 넣은 정보와 동일해야 한다.
user_id = payload['id']
#user_id에 payload에서 디코딩해서 나온 사용자 정보를 저장한다.
request.user = User.objects.get(id = user_id)
#request에 user변수를 저장한다. user변수에는 user_id와 일치하는 DB의 User 테이블의 사용자 정보를 넣어준다.
return func(self, request, *args, **kwargs)
except jwt.exceptions.DecodeError:
return JsonResponse({ 'message' : 'INVALID_TOKEN' }, status = 400)
#우리에게 없는 토큰 값이 들어오면 INVALID_TOKEN 에러를 반환한다.
except KeyError:
return JsonResponse({ 'message' : 'KEY_ERROR' }, status = 400)
return wrapper