使用 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 CSRF 令牌

如何使用 Flask-Security 注册视图?

如何在我的页面上嵌入 Flask-Security 登录表单?

实现 Python Flask-Security 时如何获取当前用户?

如何将curent_user 从flask-security 传递给可插入的视图函数?

flask-security ajax 注销导致会话错误