【问题标题】:Using Flask-Security as part of a REST API使用 Flask-Security 作为 REST API 的一部分
【发布时间】:2014-12-21 07:19:47
【问题描述】:

Flask-Security docs 提到对所有重要视图端点的 JSON/Ajax 支持。因此,通过使用 JSON 对象访问视图,可以获得所有内置 Flask-Security 的强大功能。

但是,现在我正在尝试将它用作 RESTful API 的一部分,但它不起作用,因为它需要一个 CSRF 令牌,这对于网页来说是必需的,但对于 API 来说却不是:

{
    "meta": {
        "code": 400
    },
    "response": {
        "errors": {
            "csrf_token": [
                "CSRF token missing"
            ]
        }
    }
}

解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: rest flask wtforms flask-security


    【解决方案1】:

    使用 REST API 时,首选方法是使用 JSON Web 令牌 (JWT) 之类的基于令牌的身份验证。此方案具有不同的安全环境,因为您没有在服务器端生成 HTML 或使用 cookie。我不是安全专家,但据我所知,这意味着您不易受到跨站请求伪造 (CSRF) 的影响。这就是为什么在 Flask-Security 中关闭 CSRF 令牌是可以的。

    尝试使用基于 PyJWT 令牌的身份验证方案。要获取令牌,您将凭据发布到“登录”端点并接收令牌作为响应。然后,您必须通过 HTTP 标头随每个请求发送令牌。您通常可以在 JS 端进行全局设置。

    以下是一些参考资料:

    注意:Flask-JWT 似乎使用了暂时未更新的 python itsdangerous 库。这里有一个讨论:https://github.com/mattupstate/flask-jwt/issues/10 同样,我不是安全专家,两个库似乎默认使用相同的算法处理编码/解码。 PyJWT 和 Python-Jose 都在 jwt.io 上列出并具有扩展功能。

    【讨论】:

      【解决方案2】:

      好的,想通了。它所需要的只是为应用设置一个 Flask 配置变量:

      WTF_CSRF_ENABLED = False
      

      【讨论】:

      猜你喜欢
      • 2014-07-19
      • 2016-02-09
      • 2014-06-01
      • 2017-05-29
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 2014-08-16
      • 2014-02-21
      相关资源
      最近更新 更多