[Westagram] : 로그인 데코레이터

Kiyong Lee·2021년 9월 29일
0

Django

목록 보기
17/35

과제

과제 끝 무렵에 데코레이터를 구현하라고 하셨다.

코드에 대한 간단한 가이드 같은 게 있을 줄 알았는데 이전 기수거를 곱씹어보며 하라고 하셔서..

이전 기수의 코드를 보고 따라 쳐보면서 이해를 하게 되었다.


코드

import jwt

from users.models import User
from django.http  import JsonResponse

#1
from settings     import (
    MY_ALGORITMS,
    MY_SECRET_KEY
)

def login_decorator(func) :
    def wrapper(self, request, *args, **kwrags) :
        try :
        #2
            token = request.headers.get('Authorization', None)
            payload = jwt.decode(token, MY_SECRET_KEY, MY_ALGORITMS)
            login_user = User.objects.get(email=payload['email'])
            request_user = login_user
 	
        #3       
        except jwt.exceptions.DecodeError :
            return JsonResponse({'message':"Invalid token type. Token must be a <class 'bytes'>"}, status=401)
        
        except jwt.ExpiredSignatureError :
            return JsonResponse({'message':"Expired Token"}, status=401)
        
        return func(self, request, *args, **kwrags)
    
    return wrapper

해석

코드를 보면 #1~3까지 간단하게 설정했는데, 그 부분에 대해서 코멘트가 필요하다고 내가 코드작성하면서 느꼈다


1. from settings import ..

토큰에 대해 encode, decode를 할 때 시크릿키와 알고리즘을 넣는다.

사용자에 대한 중요한 정보기 때문에 my_settings.py에 저장하였다.

그리고 my_settings.py의 변수들을 settings.py에 입력하여 저장해준 뒤

settings.py에서 해당 변수에 맞게 값을 불러올 수 있도록 함

#my_settings.py

MY_SECRET_KEY = 'django-insecure-_@vinsa2@&u*_j^!u8(i-s4-m876!a%pnf%o#k$#gm_$rm!%0&'

MY_ALGORITMS = 'HS256'

2. try

token은 사용자가 로그인을 하면 발행하기 때문에 로그인했다는 인증을 하기 위해
헤더를 'Authorization'으로 입력해야 한다.

payloads는 토큰에 담을 정보를 뜻하는데, 우리는 이메일을 이용하여 로그인하므로 이메일을 뽑아낼 수 있도록 했다.

그 이메일을 통해 login_user와 request_user에 대한 정보를 넣어준다


3. except

발생할 에러에 대해 선언했다.


4. 사용법

예를 들어, 회원 수정을 httpie로 요청한다고 해보자.

http -v POST localhost:8000/users/1 name='yooheauyeol' age=29

같은 방식으로 일반적으로 했었다.

하지만 회원수정은 로그인이 되어있어야 할 수 있는 것 아닌가?

그렇기 때문에 로그인의 징표가 될 수 있는 토큰을 입력해줘야 한다.

http -v POST localhost:8000/users/1 "Authorization:token" name='yooheauyeol' age=29

데코레이터 시작부분을 보면 token에 request.headers가 Authorization이면 가져온다라고 설정해줬기 때문에

Authorization : 로그인을 통해 발급받은 토큰

이렇게 입력해주고 나머지 정보를 입력해주면 된다.

이 토큰은 프론트로 전달이 되어, 프론트에서 관리?를 한다고 알고 있다

자세한 건 계속 해보면서 알아가야디

profile
ISTJ인 K-개발자

0개의 댓글