Tôi sử dụng bình tĩnh để tạo API của mình. Tôi đã sử dụng flask-jwt
để bật xác thực dựa trên JWT
. Bây giờ tôi cần phải làm ủy quyền.Cấp quyền sử dụng API Flask-restful. Truy cập current_identity bên trong trang trí
Tôi đã thử đặt trang trí ủy quyền của mình.
test.py (/ kiểm tra 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'
Về cơ bản để xử lý uỷ quyền cơ bản, tôi cần phải truy cập current_identity
và kiểm tra xem nó là loại. Sau đó, dựa trên kiểu của nó, tôi sẽ quyết định liệu người dùng có được phép truy cập vào api/resources hay không.
Nhưng current_identity
dường như là empty
trong trình trang trí đó. Vì vậy, để có được nó gián tiếp, tôi đã phải xem mã số jwt_handler
và làm điều được thực hiện ở đó.
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
Tại sao tôi không thể truy cập chỉ current_identity
trong authorized_api_user_type
trang trí của tôi? Cách thức PHẢI cấp phép trong bình yên tĩnh là gì?
Các bạn đã đọc câu hỏi? Câu hỏi là về truy cập 'current_identity' trong trang trí. –
'current_identity' có thể truy cập được nếu được trang trí bởi trình trang trí' jwt_required'. Tại sao bạn cần một trang trí tùy chỉnh? – aGuegu
Trang trí có thể được sử dụng cho một số trường hợp. Ví dụ - để phát hiện vai trò của người dùng. Để tránh viết lại mã bên trong tất cả các chế độ xem của bạn, bạn có thể tạo trình trang trí như "detect_role". Xin vui lòng, đọc toàn bộ câu hỏi từ OP. –