【问题标题】:Manually validate flask-extended-jwt's access token手动验证 flask-extended-jwt 的访问令牌
【发布时间】:2019-01-26 16:34:09
【问题描述】:

我有一个 SPA 应用程序,其中包含一个带有上传文件字段的表单。我有一个休息 API,其端点通过 flask-extended-jwt JWT 保护。为了验证 REST 端点,我使用 @jwt_required。我也想验证上传请求。

由于客户端我无法添加授权承载标头,所以我想在提交表单时将访问令牌添加为隐藏字段。

从表单中读取 JWT 访问令牌后,手动验证它的最佳方法是什么?

class Upload(Resource):

def post(self):
    #TODO: check for access token
    access_token = None
    if 'access_token' in request.form and request.form['access_token']:
        access_token = request.form['access_token']
    else:
        message = json.dumps({'message': 'Invalid or missing token', 'success': False})
        return Response(response=message, status=401, mimetype='text/plain')

    if access_token:
        #TODO: validate_token(access_token)

谢谢

【问题讨论】:

    标签: flask flask-jwt flask-jwt-extended


    【解决方案1】:

    flask-jwt-extended 的作者在这里。这是一个很好的问题。目前在扩展中没有支持的方式来做到这一点,从请求中获取令牌并对其进行解码是紧密耦合在一起的。这将很难解耦,因为当完整的解码链运行时会发生很多有条件的事情。例如,仅当请求通过 cookie 发送时才检查 CSRF 值,或者为了黑名单功能而区分访问令牌和刷新令牌。

    可以创建一个通用函数,它的签名类似于decode_and_verify_jwt(encoded_token, is_access_token=True, check_csrf=False)。但是,这会使 flask_jwt_extended 中的其余代码复杂化,并且在一般情况下使用是一个相当混乱的函数。

    我认为在这种情况下,在扩展中添加第四个查找会更容易,所以你可以使用类似的东西:

    app.config['JWT_TOKEN_LOCATION'] = ['headers', 'forms']
    app.config['JWT_FORM_KEY'] = 'access_token'
    # Use the rest of the application normally
    

    如果您想在 github 页面上制作票证以便我可以跟踪此问题,我将很乐意为您工作。

    【讨论】:

    • 很好的解释。到目前为止我找到的解决方案是使用 decode_token 方法。根据文档,它会返回一个解码的令牌(一个 python 字典),或者我测试过的会引发一个异常。您的解决方案仍然更通用。
    • 是的,这将解码 jwt。请注意,所有其他回调以及基于它们的所有内容(例如用户加载程序、get_jwt_identity 等)在该端点中都将不起作用。
    猜你喜欢
    • 2021-08-24
    • 2020-10-27
    • 2020-05-17
    • 2019-06-04
    • 2022-10-15
    • 2018-07-27
    • 2014-05-01
    • 1970-01-01
    • 2019-10-10
    相关资源
    最近更新 更多