[django] 로그인 데코레이터

hyeyul·2020년 5월 24일
0

Django

목록 보기
8/8

login_decorator

어떠한 페이지를 이용할 때, 사용자가 회원인지, 비회원인지를 판단하여 컨텐츠를 이용할 수 있도록 해야한다. HTTP의 성질 중에 상태를 저장하지 않는다. 라는 성질 때문에, 우리는 어떠한 컨텐츠를 사용할 때 항상 사용자가 로그인이 이미 되어 있는지, 아닌지를 판단해야 한다. 그렇기에 우리는 데코레이터를 이용하여서, 어떠한 사용자가 회원만 가능한 컨텐츠를 이용할 때 이를 쉽게 판단해 볼 것이다.

decorator

데코레이터는 대상 함수를 wrapping히고, 이 함수 앞뒤로 꾸며질 구문에 대하여 손쉽게 재사용할 수 도록 하는 또다른 함수이다.

login_decorator - logic

일단 로그인시에 프론트엔드에게 해당 아이디로 발행한 암호화된 jwt토큰을 전달해주어야 한다.

해당 유저의 정보를 확인하기 위해 HTTP헤더로 부터 토큰을 전달 받는다.
-> 없다면 에러메세지를 프론트에게 전달해준다.

백엔드는 암호화되어 전달받은 jwt 토큰을 decode한다.
-> decode시에 오류가 난다면 해당 웹페이지에서 발행한 토큰이 아니다 이를 프론트에 전달 해준다.

Django models.py에 저장된 데이터와 decode한 데이터가 일치하는 회원의 정보를 변수에 저장한다.
-> 유저의 정보가 없다면 알수 없는 유저라는 메세지를 프론트에게 전달한다.

request할 객체에 user 변수를 저장하여 프론트에게 전달한다.

def login_decorator(func):
    def wrapper(self, request, *args, **kwargs):
        try:
            access_token = request.headers.get('Authorization', None)          [1]
            payload = jwt.decode(access_token, SECRET_KEY, algorithm='HS256')  [2]
            user = Account.objects.get(email=payload['email'])                 [3]
            request.user = user                                                [4]

        except jwt.exceptions.DecodeError:                                     [5]
            return JsonResponse({'message' : 'INVALID_TOKEN' }, status=400)

        except Account.DoesNotExist:                                           [6]
            return JsonResponse({'message' : 'INVALID_USER'}, status=400)

        return func(self, request, *args, **kwargs)

    return wrapper

0개의 댓글