Uso flask-restful per creare le mie API. Ho usato flask-jwt
per abilitare l'autenticazione basata su JWT
. Ora ho bisogno di fare l'autorizzazione.Autorizzazione API restrittiva del pallone. Accedi a current_identity all'interno del decoratore
Ho provato a mettere il mio decoratore di autorizzazioni.
test.py (/ prova api)
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'
In pratica per gestire l'autorizzazione di base, ho bisogno di accedere current_identity
e verificare che sia tipo. Quindi, in base al tipo, deciderò se l'utente è autorizzato ad accedere alle API/risorse.
Ma current_identity
sembra essere empty
in quel decoratore. Quindi, per acquisirlo indirettamente, ho dovuto vedere il codice jwt_handler
e fare la cosa lì.
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
Perché non posso semplicemente accedere current_identity
nel mio authorized_api_user_type
decoratore? Qual è il modo giusto di fare l'autorizzazione in un pallone riposante?
Hai letto domanda? La domanda riguarda l'accesso a 'current_identity' nel decoratore. –
'current_identity' è accessibile se spostato dal decoratore' jwt_required'. Perché hai bisogno di un decoratore personalizzato? – aGuegu
Decoratore può essere utilizzato per un numero di casi. Ad esempio: per rilevare il ruolo dell'utente. Per evitare di riscrivere il codice all'interno di tutte le tue viste puoi creare un decoratore come "detect_role". Per favore, leggi l'intera domanda dall'OP. –