2

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

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

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

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

4

2 回答 2

6

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

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

以下是一些参考资料:

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

于 2015-09-30T14:50:08.310 回答
2

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

WTF_CSRF_ENABLED = False
于 2014-10-29T20:03:25.520 回答