我有一个烧瓶应用程序,用作REST API后端。我想为后端实现基于令牌的身份验证,但为了做到这一点,我需要检索用户令牌。 Flask-Security文档明确指出,要检索令牌,需要执行HTTP POST,并将身份验证详细信息作为JSON数据发送到身份验证端点。不幸的是,我不明白如何检索执行此类请求所需的CSRF令牌。
如果我使用随扩展程序提供的登录页面/模板,则CSRF令牌将在窗体的隐藏字段中传递给客户端。问题是:
如何在不访问和解析登录页面的情况下检索CSRF令牌,例如使用$ http方法或移动应用程序的angularJS应用程序?
显然我可以避免使用Flask-Security并自己实现这些部分,但我对webapps相对缺乏经验,我觉得我可能会以错误的方式接近它。
答案 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() }}">
来自邮递员:
这是我尝试的替代方案,也许这会更成功?这与flask-security示例应用程序提供的答案基本相同:
答案 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