[Django] Login Decorator (pyJWT)

Yerin·2020년 1월 3일
0

study-django

목록 보기
2/5
post-custom-banner

Decorator

대상 함수를 래핑하고 이 함수 앞뒤로 꾸며질 구문들에 대해 손쉽게 재사용할 수 있도록 다른 곳에 미리 함수를 만들어 두는 것. 로그인 데코레이터의 경우, 회원이 댓글 작성이나 특정권한을 가지고 있는지 확인하기 위해 데코레이터를 쓴다.

  • 로그인 데코레이터의 목적

웹사이트 상에서 권한을 가진 유저만 이용가능한 서비스를 이용할 수 있는 곳에 한해, 유저가 로그인한 회원인지 이용가능한 권한을 가지고 있는지 등을 확인하기 위해 미리 선언해 둔 함수를 사용하기 위한 목적.

Logic

  1. 해당유저의 정보를 확인하기 위해 프론트엔드에서 http 헤더를 통해 토큰을 전달받기.
  2. 백엔드에서는 암호화되어 전달받은 jwt토큰을 decode 한다.
  3. 장고 models.py에 저장된 데이터와 decode한 데이터가 일치하는 회원의 정보를 변수에 저장한다.
  4. request할 객체를 user 변수에 저장하여 프론트엔드에게 전달한다.
  5. 위 내용이 잘 실행되는지 httpie나 다른방법으로 테스트 및 검증진행한다.
import jwt
import json
from django.http import JsonResponse
from .models import Accounts
from wespace.settings import SECRET_KEY



def login_decorator(func):
    def wrapper(self, request, *args, **kwargs):
        if "Authorization" not in request.headers:
            return JsonResponse({"error_code":"INVALID_LOGIN"}, status=401)

        encode_token = request.headers["Authorization"]

        try:
            data = jwt.decode(encode_token, SECRET_KEY, algorithm='HS256')
            account = Accounts.objects.get(id=data['id'])
            request.account = account

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

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

        return func(self, request, *args, **kwargs)
    return wrapper
~                                                                      
  • 테스트용 뷰
    account/views.py
class Decorator(View):
    @login_decorator
    def get(self, request):
        return JsonResponse({'nick_name' : request.account.nick_name})
        
  • 테스트를 위한 urls.py
from .views import Decorator

urlpatterns = [
	path('/a', Decorator.as_view())
    ]
    
profile
졸꾸 !!!
post-custom-banner

0개의 댓글