TIL DAY 19 || Login Decorator with Response Header


Django frameworkにログインしてtokenの論理をget、postで検証するたびに、コードが非常に長くなります.
したがって、jwtを検証するためのdecoratorを作成してコード長を短縮することにした.

auth_check Decorator


次はauth_check decorator関数で囲まれたget()関数です.

ログインauth checkロジックを含むdecorator関数を次に示します.
import jwt
import json
from jwt.exceptions import InvalidSignatureError, DecodeError

from django.http import JsonResponse

from account.models             import User
from project_westagram.settings import SECRET_KEY
from utils.debugger             import debugger


def auth_check(func):
    def wrapper(self, request):
        data = request.headers
        try:
            encoded_auth_token = data.get('Authorization')
            decoded_auth_token = jwt.decode(encoded_auth_token, SECRET_KEY, algorithms='HS256')
            
            user_id = decoded_auth_token['user_id']
            user    = User.objects.get(id=user_id)

            request.user = user
            return func(self, request)

        except KeyError:
            return JsonResponse({'message': 'AUTHORIZATION_KEY_ERROR'})
        except InvalidSignatureError:
            return JsonResponse({'message': 'SIGNATURE_VERIFICATION_FAILED'})
        except DecodeError:
            debugger.exception('DecodeError')
            return JsonResponse({'message': 'DECODE_ERROR'})
        except User.DoesNotExist:
            return JsonResponse({'message': 'USER_DOES_NOT_EXIST'})
    return wrapper

  • まずauth checkアクセサリの関数を呼び出します.

  • auth checkアクセラレータ関数はget()関数自体をパラメータとして呼び出す.

  • auth check関数は、パッケージ関数自体を返します.

  • パッケージ関数でselfとrequestをパラメータとして受け入れます.私が*args**kwragsを追加しなかったのは、私がどんな値を得るか知っていたからです.(selfオブジェクトとrequest objectの2つ)ただし、どの値が入力されるか分からない場合は、追加するのが正しいです.

  • request.フロントに渡されたトークンは、ヘッダの"Authorization"キー値によって取得される.

  • jwtモジュールを使用してライブラリプロジェクトのSECRET_KEY値を入力し、私のサーバに発行されたtokenがあるかどうかを確認します.△値段がないと、間違いになります.

  • 復号されたtokenには、サーバを介して送信された{'user_id': <user_id>}の値を含むペイロードの値が含まれます.
  • user_idで登録されたユーザオブジェクトを取得します.

  • request objectにuserを追加し、Userオブジェクトを割り当てます.

  • パッケージ関数からfunc(self,request)を返します.
    戻る前に、エラーが発生した場合はDecorator関数線で処理されるため、個別のView関数で実装する必要はありません.