def signin_decorator(func):
def wrapper(self, request, *args, **kwargs):
try:
access_token = request.headers.get('Authorization', None)
payload = jwt.decode(access_token, SECRET_KEY, algorithms='HS256')
user = User.objects.get(id=payload['id'])
request.user = user
except jwt.exceptions.DecodeError:
return JsonResponse({'message' : 'INVALID_TOKEN' }, status=400)
except User.DoesNotExist:
return JsonResponse({'message' : 'INVALID_USER'}, status=400)
except:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
return func(self, request, *args, **kwargs)
return wrapper
acess_token = request.headers.get('Authorization', None)
payload = jwt.decode(access_token, SECRET_KEY, algorithms='HS256')
user = User.objects.get(id=payload['id'])
>>> payload
{'id': 1}
>>> payload['id']
1
request.user = user
이 때 DecodeError로만 except 처리해도 InvalidSignatureError가 같이 핸들링 된다. InvalidSignatureError는 DecodeError를 인자로 받는다. 그래서 DecodeError만 처리해도 같이 처리된 것이다.
무슨 오류인지 세부적으로 알려주는 역할이다.
이 때 request.headers['AUTHORIZATION']으로 쓰는지 request.headers.get('AUTHORIZATION')으로 쓰는지는 기획에 달려있다. KeyError를 except 처리해서 다시 로그인 하기를 권하는 쪽으로 빠진다거나, get의 결과로 값이 있는 회원 환경과 None을 받는 비회원 환경에서 다른 뷰를 보여주는 등.
except jwt.exceptions.DecodeError: return JsonResponse({'message' : 'INVALID_TOKEN' }, status=400)
except User.DoesNotExist: return JsonResponse({'message' : 'INVALID_USER'}, status=400)
except: return JsonResponse({'message':'KEY_ERROR'}, status=400)
<참고>