๐ Decorator
๋
๋ฆฝ์ ์ธ HTTP ํต์ ๋๋ฌธ์ ํ์ด์ง๊ฐ ๋์ด๊ฐ๋ ๋ง๋ค ์๋ก์ด ์ธ์ฆ์ ํด์ค์ผ ํ๋ค.
์๋ก์ด ํ์ด์ง์์ ์ธ์ฆ์ ํด์ผํ์ง๋ง ์ธ์ฆ ์ฝ๋๊ฐ ๋งค๋ฒ ๋ชจ๋ ์ฝ๋์ ๋ถ์ผ๋ฉด ์ฝ๋๊ฐ ๋ณต์กํด์ง๊ณ ๊ธธ์ด์ง๋ค.
์ฝ๋์ ๊ฐ๋
์ฑ๊ณผ ๊ฐ๊ฒฐํ๋ฅผ ์ํด ์ธ์ฆ ๊ตฌํํ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
import jwt
from django.http.response import JsonResponse
from my_settings import SECRET_KEY, ALGORITHM
from users.models import User
def login_required(func):
def wrapper(self, request, *args, **kwargs):
try:
access_token = request.headers.get('Authorization', None)
# ํ๋ก ํธ๊ฐ http์์ฒญ์์ ํค๋์ Authorization:key๊ฐ, access_token:value๊ฐ ๋ฐฑ์๊ฒ ๋ณด๋!
# ๋ฐ์ฝ๋ ์ดํฐํจ์๋ authorization ๊ฐ์ ์ฝ๊ณ , ํ ํฐ์ด ๋ง๋์ง ํ์ธ
# ํ ํฐ์ด ๋ง์ผ๋ฉด(์์ผ๋ฉด), ๊ทธ๊ฐ์ ๋ณตํธํ(decoding)ํด์ ์ฌ์ฉ์ id ์ฝ์ด๋ค์ด๊ณ ํด๋น ์ฌ์ฉ์์ ๋ก๊ธด ์ฌ๋ถ ํ์ธ
payload = jwt.decode(access_token, SECRET_KEY, algorithms=ALGORITHM)
# ํ ํฐ์ ๋์ฝ๋ฉํด์ ๋์ค๊ฒ ๋ ์ฌ์ฉ์์ ๋ํ ์ ๋ณด๋ฅผ payload์ ๋ด๋๋ค.
# ๋์ผํ ์ฌ์ฉ์๋ผ๋ฉด ๋ฐํํ ๋ ๋์จ ํ ํฐํ๊ณ ๋์ผํ ํ ํฐ์ด payload์ ๋ฐํ๋๊ฒ ์ง
# ๋์ฝ๋ฉ์ secret_key์ algorithm์ ํ ํฐ ๋ฐํ์ ๋ฃ์๋ ์ ๋ณด์ ๊ฐ์์ผํจ!
user = User.objects.get(id=payload['user_id']
# ํ ํฐ ๋์ฝ๋ฉํด์ ์ป์ ์ฌ์ฉ์ ์ ๋ณด์ ๋งค์นญ๋๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ user ๋ณ์์ ์ ์ฅ!
request.user = user
# request๊ฐ์ฒด์ user๊ฐ์ฒด ๋ฃ์ด์ฃผ๊ธฐ. (request๊ฐ์ฒด has headers, body, startline)
# request๊ฐ์ฒด์ ์ถ๊ฐ๋ user๊ฐ์ฒด๋ ๊ทธ๋๋ก ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋น ์ ธ๋์ค๋ ์๊ฐ ์ฌ๋ผ์ง์ง์๊ณ views.py์ ์๋ Profileํด๋์ค์ get๋งค์๋์ ์ ํด์ง๋ค.
except jwt.DecodeError:
# ์๋ ํ ํฐ๊ฐ ๋ค์ด์ค๋ฉด DecodeError ์ฒ๋ฆฌ!
return JsonResponse({"message":"invalid_token"}, status=401)
except User.DoesNotExist:
# ์๋ชป๋ ์ ์ ๊ฐ ๋ค์ด์ค๋ฉด DoesNotExist ์ฒ๋ฆฌ!
return JsonResponse({"message":"Unknown_user"}, status=400)
return func(self, request, *args, **kwargs)
return wrapper
# ์กฐ๊ฑด์ด ๋ชจ๋ ๋ง์ ๋จ์ด์ง๋ฉด ์์๋ ๋ ๋ฐ์ parameter๋ฅผ ์ ๋ถ ๋ค ๋ฆฌํด,
# ๋ง์ง๋ง์ผ๋ก wrapperํจ์ ๋ฆฌํด