使用 Flask-Security 作为 REST API 的一部分
Posted
技术标签:
【中文标题】使用 Flask-Security 作为 REST API 的一部分【英文标题】:Using Flask-Security as part of a 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"
]
解决这个问题的最佳方法是什么?
【问题讨论】:
【参考方案1】:使用 REST API 时,首选方法是使用 JSON Web 令牌 (JWT) 之类的基于令牌的身份验证。此方案具有不同的安全环境,因为您没有在服务器端生成 html 或使用 cookie。我不是安全专家,但据我所知,这意味着您不易受到跨站请求伪造 (CSRF) 的影响。这就是为什么在 Flask-Security 中关闭 CSRF 令牌是可以的。
尝试使用基于 PyJWT 令牌的身份验证方案。要获取令牌,您将凭据发布到“登录”端点并接收令牌作为响应。然后,您必须通过 HTTP 标头随每个请求发送令牌。您通常可以在 JS 端进行全局设置。
以下是一些参考资料:
http://jwt.io/ https://pythonhosted.org/Flask-JWT/(见下方注释) Combining Flask-restless, Flask-security and regular Python requests https://github.com/jpadilla/pyjwt/ https://github.com/mpdavis/python-jose/ https://auth0.com/docs/server-apis/python https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/ https://auth0.com/blog/2014/01/27/ten-things-you-should-know-about-tokens-and-cookies/注意:Flask-JWT 似乎使用了暂时未更新的 python itsdangerous
库。这里有一个讨论:https://github.com/mattupstate/flask-jwt/issues/10 同样,我不是安全专家,两个库似乎默认使用相同的算法处理编码/解码。 PyJWT 和 Python-Jose 都在 jwt.io 上列出并具有扩展功能。
【讨论】:
【参考方案2】:好的,想通了。它所需要的只是为应用设置一个 Flask 配置变量:
WTF_CSRF_ENABLED = False
【讨论】:
这对您的主应用有何影响?它会降低网站的安全性吗? 很可能不是必须使用的东西。本文档可能对其他来到这里的用户有所帮助:flask-wtf.readthedocs.io/en/latest/csrf.html#ajax以上是关于使用 Flask-Security 作为 REST API 的一部分的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的页面上嵌入 Flask-Security 登录表单?
实现 Python Flask-Security 时如何获取当前用户?