我使用龙卷风和jwt装饰器,如下所示:
def jwtauth(handler_class):
"""
Tornado JWT Auth Decorator
"""
def wrap_execute(handler_execute):
def require_auth(handler, kwargs):
auth = handler.request.headers.get(AUTHORIZATION_HEADER)
if auth:
parts = auth.split()
if not is_valid_header(parts):
return_header_error(handler)
token = parts[1]
try:
result = jwt.decode(
token,
SECRET_KEY,
options=jwt_options
)
except Exception as err:
return_auth_error(handler, str(err))
else:
handler._transforms = []
handler.write(MISSING_AUTHORIZATION_KEY)
handler.finish()
return result
def _execute(self, transforms, *args, **kwargs):
try:
result = require_auth(self, kwargs)
except Exception:
return False
return handler_execute(self, transforms, *args, **kwargs)
return _execute
handler_class._execute = wrap_execute(handler_class._execute)
return handler_class
@jwtauth
class MyHandler(tornado.web.RequestHandler):
def post(self):
unit = json.loads(self.request.body.decode('utf-8'))
# TODO:
# get the result from jwtauth decorator and use it here
print(result) # The result from jwtauth
现在,我想获取jwt解码结果并将其传递给MyHandler进行进一步验证。我可以做吗?我检查了大多数注释,可以将参数传递给装饰器,但无法从中获取。可以将jwtauth结果传递给我的函数吗?
答案 0 :(得分:1)
类装饰器将带您的类并吐出类的新版本(通常会添加一些功能)。在这种情况下,@jwtauth
装饰器将带您的类并吐出一个新类,以确保检查每个请求以查看授权标头中的有效JWT令牌。 tornado.web.RequestHandler._execute
internally calls post
。当前的行为是,如果JWT令牌身份验证失败,则将永远不会调用post
。
简而言之,您可能只想在下面引发一个错误,而不是返回False。
try:
result = require_auth(self, kwargs)
except Exception:
return False
如果您需要添加更多有关引发哪种错误的逻辑,那么您可能希望将其与类一起传递给装饰器。