11

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

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

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

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

4

5 回答 5

5

我有一个类似的用例,并通过遵循 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 /login 端点的发布数据中。

于 2013-10-14T22:26:33.970 回答
3

嗯,有一个简单的方法。访问。可以将配置项WTF_CSRF_ENABLED设置为 False 以禁用 csrf。然后一切如你所愿。

于 2015-12-10T09:32:01.250 回答
2

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

于 2013-08-26T06:03:57.280 回答
0

昨晚我与这个问题斗争了几个小时。这就是最终为我工作的东西:

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

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)

在我的 /login HTML 中:

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

来自邮递员:

在此处输入图像描述

这是我尝试过的替代方案,也许这会更成功?这与烧瓶安全示例应用程序给出的回复基本相同:

在此处输入图像描述

于 2015-01-13T16:01:23.697 回答
0

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

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

顺便说一句 -烧瓶安全文档说:

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

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

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

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

然而, request.json 是空的:(

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

于 2015-01-13T10:37:02.060 回答