Flask-Security CSRF令牌

时间:2013-08-26 03:19:43

标签: angularjs flask flask-security

我有一个烧瓶应用程序,用作REST API后端。我想为后端实现基于令牌的身份验证,但为了做到这一点,我需要检索用户令牌。 Flask-Security文档明确指出,要检索令牌,需要执行HTTP POST,并将身份验证详细信息作为JSON数据发送到身份验证端点。不幸的是,我不明白如何检索执行此类请求所需的CSRF令牌。

如果我使用随扩展程序提供的登录页面/模板,则CSRF令牌将在窗体的隐藏字段中传递给客户端。问题是:

如何在不访问和解析登录页面的情况下检索CSRF令牌,例如使用$ http方法或移动应用程序的angularJS应用程序?

显然我可以避免使用Flask-Security并自己实现这些部分,但我对webapps相对缺乏经验,我觉得我可能会以错误的方式接近它。

5 个答案:

答案 0 :(得分:4)

我有一个类似的用例,并通过Flask-WTF文档中的这个示例结束解决它:https://flask-wtf.readthedocs.org/en/latest/csrf.html#ajax

因此,CSRF通过CsrfProtect(app)保护应用程序,csrf_token()在所有模板中都可用。然后,您可以通过脚本标记轻松地将其提供:

<script type="text/javascript">
    var csrftoken = "{{ csrf_token() }}"
</script>

现在将令牌添加到Flask-Security /登录端点的发布数据中。

答案 1 :(得分:3)

嗯,有一个简单的方法。 Visit。可以将配置项 WTF_CSRF_ENABLED 设置为False以禁用csrf。然后一切都按照你的意愿进行。

答案 2 :(得分:2)

我没有测试过这是否有效,但是从简要检查source code开始,您必须向内容类型设置为application/json的登录URL发送GET请求。 Flask-Security使用登录表单的JSON版本响应此请求,并包含令牌。获得令牌后,您可以发送POST请求。

答案 3 :(得分:1)

昨晚我和这个问题争了好几个小时。以下是最终为我工作的内容:

当我创建我的应用实例时:

app = Flask(__name__)
app.config.from_object(config_by_name[config_name])

# Create database connection object
app.db = db
app.db.init_app(app)

CsrfProtect(app)

在我的/登录HTML中:

<meta name="csrf-token" content="{{ csrf_token() }}">

来自邮递员:

enter image description here

这是我尝试的替代方案,也许这会更成功?这与flask-security示例应用程序提供的答案基本相同:

enter image description here

答案 4 :(得分:0)

[写作答案,因为我没有足够的声誉来发表评论]

我遇到了与Jacopo完全相同的问题,因为 - request.json为空,因此不会触发get_auth_token()。

BTW - Flask Security documentation说:

  

通过执行HTTP POST检索用户身份验证令牌来启用基于令牌的身份验证,其中身份验证详细信息为针对身份验证端点的JSON数据。

所以我尝试了POST,而不是GET(仍然是空请求的相同问题.json) 我使用json数据调用/ login:

{"email": "test@example.com", "password": "test123"}

并使用Google Chrome中的Postman客户端发送请求。

然而,request.json是空的:(

编辑:我能够使用python的请求模块继续前进。详情here