【问题标题】:flask_jwt_extended not checking for X-CSRF-TOKEN in headerflask_jwt_extended 不检查标头中的 X-CSRF-TOKEN
【发布时间】:2021-05-14 21:13:27
【问题描述】:

我在 React Native 中发送了以下请求:

const getData = async (cookie) => {
    const resp = await fetch('/some_info');
    const data = await resp.json();
    console.log(data)
}

如您所见,我故意没有添加适当的标题:

headers: {
                'X-CSRF-TOKEN':value,
            }

在请求中,因为我想验证没有它 GET 请求会失败。

以下是我的配置:

JWT_ACCESS_TOKEN_EXPIRY_MINS = 15
JWT_REFRESH_TOKEN_EXPIRY_MINS = 1000
JWT_TOKEN_LOCATION = ['cookies']
JWT_COOKIE_CSRF_PROTECT = True
JWT_COOKIE_SECURE = False  # change to True in prod

在我的浏览器中,我可以看到以下相关 cookie:

端点定义如下:

@app.route('/some_info', methods=['GET'])
@jwt_required
def get_some_info():
    user_identity = get_jwt_identity()
    name = get_user_name_from_identity()
    age = get_user_age_from_identity()
    return jsonify({
           'name': name,
           'age': age
    })

当请求发生时,在控制台日志中,我得到一个200 并且能够看到 json 数据。在请求标头(使用 Chrome 检查器)中,我看到 X-CSRF-TOKEN 从未设置。为什么会发生这种情况/为什么请求会通过?

来自 JWT 扩展文档:

# By default, the CRSF cookies will be called csrf_access_token and
# csrf_refresh_token, and in protected endpoints we will look for the
# CSRF token in the 'X-CSRF-TOKEN' header. You can modify all of these
# with various app.config options. Check the options page for details.

【问题讨论】:

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


    【解决方案1】:

    答案在文档中。 CSRF 保护只发生在可以改变数据的方法上,也就是 GET

    这是文档:

    JWT_CSRF_METHODS
    The request types that will use CSRF protection. Defaults to ['POST', 'PUT', 'PATCH', 'DELETE']
    

    您可以通过将GET 添加到列表或调用 POST 类型的端点来测试它是否有效

    【讨论】:

      猜你喜欢
      • 2016-03-29
      • 2017-05-14
      • 2019-01-20
      • 2015-09-13
      • 2016-04-19
      • 2014-04-11
      • 2016-10-03
      • 2011-08-30
      • 2021-03-18
      相关资源
      最近更新 更多