TIL DAY 19 || Login Decorator with Response Header
Django frameworkにログインしてtokenの論理をget、postで検証するたびに、コードが非常に長くなります.
したがって、jwtを検証するためのdecoratorを作成してコード長を短縮することにした.
auth_check Decorator
まずauth checkアクセサリの関数を呼び出します.
auth checkアクセラレータ関数はget()関数自体をパラメータとして呼び出す.
auth check関数は、パッケージ関数自体を返します.
パッケージ関数でselfとrequestをパラメータとして受け入れます.私が
request.フロントに渡されたトークンは、ヘッダの
jwtモジュールを使用してライブラリプロジェクトの
復号されたtokenには、サーバを介して送信された
request objectにuserを追加し、Userオブジェクトを割り当てます.
パッケージ関数からfunc(self,request)を返します.
戻る前に、エラーが発生した場合はDecorator関数線で処理されるため、個別のView関数で実装する必要はありません.
したがって、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
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関数で実装する必要はありません.
Reference
この問題について(TIL DAY 19 || Login Decorator with Response Header), 我々は、より多くの情報をここで見つけました https://velog.io/@tk_kim/TIL-DAY-19-Login-Decorator-with-Response-Headerテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol