如何使用 Flask 和 flask_jwt_extended 进行自定义 JWT 验证?

Posted

技术标签:

【中文标题】如何使用 Flask 和 flask_jwt_extended 进行自定义 JWT 验证?【英文标题】:How can I do custom JWT validation with Flask and flask_jwt_extended? 【发布时间】:2017-12-10 19:45:53 【问题描述】:

我想在调用 @jwt_required 时向令牌添加额外的验证。我想验证其中一项声明。有没有我可以用 JWTManager 做到这一点?

目前我的代码只是调用:

jwt = JWTManager(app)

我用@jwt_required装饰函数

【问题讨论】:

【参考方案1】:

在我的脑海中,我的想法是创建一个自定义装饰器来包装jwt_required

通过the functools.wraps documentation 大致了解一下它的外观:

from functools import wraps
from flask_jwt_extended import jwt_required
from flask_jwt_extended.view_decorators import _decode_jwt_from_request
from flask_jwt_extended.exceptions import NoAuthorizationError

def custom_validator(view_function):
    @wraps(view_function)
    def wrapper(*args, **kwargs):
        jwt_data = _decode_jwt_from_request(request_type='access')

        # Do your custom validation here.
        if (...):
            authorized = True
        else:
            authorized = False

        if not authorized:
            raise NoAuthorizationError("Explanation goes here")

        return view_function(*args, **kwargs)

    return jwt_required(wrapper)

@app.route('/')
@custom_validator
def index():
    return render_template('index.html')

Here 是您可以找到 jwt_required 源代码的地方。

【讨论】:

这看起来非常好,Nathan 并帮助我下一步添加基于角色的验证。唯一的问题是你 return jwt_required 导致错误:'tuple' object has no attribute '__module__' 我觉得应该是:return view_function(*args, **kwargs) return jwt_required(wrapper) 我从来没有运行过代码,所以我对它遇到错误并不感到惊讶。随意继续编辑此答案以反映最终的工作原理。【参考方案2】:

在你的另一个问题中发布了这个,但我也会在这里发布,以防其他人偶然发现这个。

作者在这里。对于它的价值,flask-jwt 也不支持要求声明(即使它说支持)。 https://github.com/mattupstate/flask-jwt/issues/98

编辑:现在可以在 flask-jwt-extended 中使用。 https://github.com/vimalloc/flask-jwt-extended/issues/64#issuecomment-318800617

干杯

【讨论】:

感谢 vimalloc。我认为解决我所有问题的方法是按照上面 Nathan 的建议实施装饰器。 我会在 github 上提出问题,因为我认为添加对要求声明的支持会很棒,尤其是 flask-jwt 认为它能够扩展所需参数列表的功能。

以上是关于如何使用 Flask 和 flask_jwt_extended 进行自定义 JWT 验证?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Vue 和 Flask 中使用会话?

如何使用 Python 和 Flask 获取请求变量的值 [重复]

如何使用 Flask 和 flask_jwt_extended 进行自定义 JWT 验证?

FLASK-SQLALCHEMY如何使用or和and条件进行组合查询

如何使用flask-flatpages突出显示语法

如何使用 Flask-USER 管理保护 Flask-RESTful?