과제 끝 무렵에 데코레이터를 구현하라고 하셨다.
코드에 대한 간단한 가이드 같은 게 있을 줄 알았는데 이전 기수거를 곱씹어보며 하라고 하셔서..
이전 기수의 코드를 보고 따라 쳐보면서 이해를 하게 되었다.
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까지 간단하게 설정했는데, 그 부분에 대해서 코멘트가 필요하다고 내가 코드작성하면서 느꼈다
토큰에 대해 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'
token은 사용자가 로그인을 하면 발행하기 때문에 로그인했다는 인증을 하기 위해
헤더를 'Authorization'으로 입력해야 한다.
payloads는 토큰에 담을 정보를 뜻하는데, 우리는 이메일을 이용하여 로그인하므로 이메일을 뽑아낼 수 있도록 했다.
그 이메일을 통해 login_user와 request_user에 대한 정보를 넣어준다
발생할 에러에 대해 선언했다.
예를 들어, 회원 수정을 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 : 로그인을 통해 발급받은 토큰
이렇게 입력해주고 나머지 정보를 입력해주면 된다.
이 토큰은 프론트로 전달이 되어, 프론트에서 관리?를 한다고 알고 있다
자세한 건 계속 해보면서 알아가야디