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

时间:2017-07-06 17:03:20

标签: python flask jwt flask-jwt-extended

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

目前我的代码只是调用:

jwt = JWTManager(app)

我用@jwt_required

装饰这些函数

2 个答案:

答案 0 :(得分:3)

在我的头顶上,我倾向于创建一个包裹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的源代码的地方。

答案 1 :(得分:1)

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

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

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

干杯