로그인 데코레이터 만들기

min00young·2020년 11월 10일
0

로그인 데코레이터 만들어야 하는 이유

사용자는 로그인이후, 로그인된 상태에서 이용가능한 페이지를 여러곳다니게 되는데 이때 서버쪽에서 views.py에서 http의 stateless 속성으로 인해서 회원인지 여부를 확인하는 로직을 넣어줘야 합니다. 그런부분들이 코드를 길게 하고, 속도도 느리게 되기 때문에 데코레이터를 이용합니다.

코드


def login_deco(func): 
    def wrapper(self, request, *args, **kwargs):

        SECRET_KEY = 'secret'

        if "Authorization" not in request.headers: #header에 토큰값이 담겨있는지 확인한다.
            return JsonResponse({"error_code" : "INVALID_LOGIN"}, status=401)

        encode_token = request.headers["Authorization"] #헤더의 토큰 값을 입력해준다.
        print(encode_token)

        try:
            data = jwt.decode(encode_token, SECRET_KEY, algorithm='HS256') #데이터를 decode하여준다. encode할 때 썻던 id값을 추출하기 위해서 이다.
            print(data)                       
            #user = User.objects.get(email = data["email"]) #id를 통해 user의 정보를 user에 담아준다.
            #request.user = user #가장 중요한 부분이다. get을 통해 가져온 user의 정보를 request.user에 담아준다. 이는 후에 데코레이터를 붙혀줄 views에 사용된다.

        except jwt.DecodeError:
            return JsonResponse({"error_code":"INVALID_TOKEN"}, status=401)

        except User.DoesNotExist:
            return JsonResponse({"error_code":"UNKNOWN_USER"}, status=401)

        return func(self, request, *args, **kwargs) #리턴되는 requset의 값은 user을 정보를 담은 requset가 된다.

    return wrapper


class Login_test(View):
    @login_deco
    def get(self, request):
        return JsonResponse({'message':'success'}, status=200)

postman을 이용한 기능검증

발행된 jwt의 값을 headers에 넣어서 request를 보냅니다.

profile
개발공부를 하면서 배우고 경험하고 앞으로 알아가야할것들에 대해서 정리하고 있습니다 🙂

0개의 댓글