본문 바로가기
Djnago

[Django] login Decorator useing pyjwt

by UnoCode 2020. 7. 18.

어떠한 함수를 작성하고 이 함수 앞뒤로 실행해야할 코드를 정의하는데 있습니다.

 

로그인 데코레이터 같은 경우 회언이 댓글을 작성하거나 특정권한을 가지고 있는지 확이날때 사용합니다.

 

import jwt
import json
from django.http import JsonResponse
from .models import {자신의 app models}
from {key 가져오는 경로} import SECRET_KEY

 

def login_decorator(func):
    def wrapper(self,request,*args, **kwargs):
        if "Authorization" not in request.headers:
            return JsonResponse({"message":"해더에 Authorization라는 값이 없을경우 메시지"},status=401)
        
        token = request.headers["Authorization"]
        try:
            user_token = jwt.decode(token,DBConnent.SECRET,algorithm='HS256')
            user = models.User.objects.get(id=user_token["id"])
            request.user = user

        except jwt.DecodeError:
            return JsonResponse({"message":"토큰이 값이 없을 경우"},status=401)

        except models.User.DoesNotExist:
            return JsonResponse({"message":"토큰값을 decode한 값이 유효하지 않는 경우"},status=401)

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

 

사용 예시

 

class CommentView(View):
    @login_decorator
    def post(self, request):
        data = json.loads(request.body)
        try:
            user = User.objects.get(id=request.user.id)
            posting = models.Posting.objects.get(id=data["posting"])
            models.Comment(
                user=user, 
                posting=posting,
                content=data["content"], ).save()
            return JsonResponse({"message": "SUCESS"},status=200)
        except KeyError:
            return JsonResponse({"message": "KEY_ERROR"}, status=400)

 

Postman으로 확인 

 

body의 내용

 

위 로직은 사용자가 댓을 달려고 할때 로크인 데코레이터를 적용한 사례입니다.

 

데코레이터를 해석하면 userid값이 오며 이 값을 objects.get 으로 해석해서 유효값인지 확인합니다.

'Djnago' 카테고리의 다른 글

[Django] DB Query_Count And Logging  (0) 2020.08.09
[Django] prefetch_related  (0) 2020.07.25
[Django] 기본 세팅  (0) 2020.07.16
[Django] Custom command Create  (0) 2020.07.04
[Django] Django-tutorial 따라하기 1-2  (0) 2020.07.02

댓글