[TIL] 인가 데코레이터

양희연·2020년 6월 21일
1

Django

목록 보기
8/14
post-thumbnail

이전에 포스트 했던 회원가입 & 로그인 기능에 이어서
웹 사이트의 user인지 확인하는 인가 데코레이터 기능을 구현해보자!

이 데코레이터를 이용해 회원만이 할 수 있는 기능을 추가적으로 작업할 수 있다.



🔑 인가 데코레이터 작성

앱 안에 utils.py 파일을 생성해 그 곳에 작성한다.

import json
import jwt

from django.http import JsonResponse

from westagram.settings import (
    SECRET_KEY,
    ALGORITHM
)
from .models import Account

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

        try:
            access_token = request.headers.get('Authorization', None)
            user_id = jwt.decode(access_token, SECRET_KEY, algorithm = ALGORITHM)['id']
            user = Account.objects.get(id = user_id)
            request.user = user

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

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

        except Account.DoesNotExist:
            return JsonResponse({'message' : 'UNKNOWN_USER'}, status = 404)
            
        except KeyError:
            return JsonResponse({'message' : 'INVALID_KEY'}, status = 400)

    return wrapper



이제 위에서 만든 데코레이터를 활용하여 유저만이 할 수 있는 기능을 만들 수 있다. 👊

로그인 한 사용자만 댓글을 달 수 있는 댓글기능을 만들어보자.

🧑🏻‍💻 댓글 기능 구현하기

먼저 댓글 앱을 만들고 모델을 작성해준다.

(project) $ ./manage.py startapp comment

> models.py

from django.db import models

class Comment(models.Model):
    email = models.ForeignKey('account.Account', on_delete = models.SET_NULL, null=True)
    comment = models.CharField(max_length = 1000)

    class Meta:
        db_table = 'comments'

> views.py

import json

from django.views import View
from django.http import (
    HttpResponse, 
    JsonResponse
)

from account.utils import login_required
from account.models import Account
from .models import Comment

class CommentView(View):
    @login_required
    def post(self, request):
        data = json.loads(request.body)

        try:
            Comment.objects.create(
                email = Account.objects.get(email = request.user.email),
                comment = data['comment']
            )
            return HttpResponse(status = 200)

        except KeyError:
            return JsonResponse({'message' : 'INVALID_KEY'}, status = 400)

> urls.py

#comment/urls.py

from django.urls import path
from .views import CommentView

urlpatterns = [
    path('', CommentView.as_view()),
]

> httpie로 확인

http -v localhost:8000/comment 'Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyLWlkIjo1fQ.tBQu0HfnOYK7lL3tH5ImgsI-y4Jz1RKscJWbV3U2QMI' comment='hello'
profile
꾸준히 나아가자!

0개의 댓글