Я использую flask-restful для создания своих API. Я использовал flask-jwt
для включения аутентификации на основе JWT
. Теперь мне нужно сделать авторизацию.Автоклавирование API с флаконами. Access current_identity внутри декоратора
Я пробовал поставить свой авторизованный декоратор.
test.py (/ испытание апи)
from flask_restful import Resource
from flask_jwt import jwt_required
from authorization_helper import authorized_api_user_type
class Test(Resource):
decorators = [jwt_required(), authorized_api_user_type()]
def get(self):
return 'GET OK'
def post(self):
return 'POST OK'
В основном для обработки базового разрешения, мне нужно, чтобы получить доступ current_identity
и проверить его тип. Затем, основываясь на его типе, я собираюсь решить, имеет ли пользователь право доступа к api/resources.
Но current_identity
похоже empty
в этом декораторе. Поэтому, чтобы получить это косвенно, я должен был увидеть код jwt_handler
и сделать то, что там сделано.
authorization_helper.py
from functools import wraps
from flask_jwt import _jwt, JWTError
import jwt
from models import Teacher, Student
def authorized_api_user_type(realm=None, user_type='teacher'):
def wrapper(fn):
@wraps(fn)
def decorator(*args, **kwargs):
token = _jwt.request_callback()
if token is None:
raise JWTError('Authorization Required', 'Request does not contain an access token',
headers={'WWW-Authenticate': 'JWT realm="%s"' % realm})
try:
payload = _jwt.jwt_decode_callback(token)
except jwt.InvalidTokenError as e:
raise JWTError('Invalid token', str(e))
identity = _jwt.identity_callback(payload)
if user_type == 'student' and isinstance(identity, Student):
return fn(*args, **kwargs)
elif user_type == 'teacher' and isinstance(identity, Teacher):
return fn(*args, **kwargs)
# NOTE - By default JWTError throws 401. We needed 404. Hence status_code=404
raise JWTError('Unauthorized',
'You are unauthorized to request the api or access the resource',
status_code=404)
return decorator
return wrapper
Почему я не могу просто получить доступ к current_identity
в моем authorized_api_user_type
декоратора? Каков ПРАВЫЙ способ сделать авторизацию в колбе-успокоительной?
Читали вопрос? Вопрос о доступе к 'current_identity' в декораторе. –
'current_identity' доступен, если он завернут декором' jwt_required'. Зачем вам нужен индивидуальный декоратор? – aGuegu
Декоратор может использоваться для нескольких случаев. Например - для определения роли пользователя. Чтобы избежать перезаписи кода во всех ваших представлениях, вы можете создать декоратор, например, «detect_role». Пожалуйста, прочитайте весь вопрос от OP. –