【问题标题】:symfony2 csrf token invalid on ajax requestsymfony2 csrf 令牌对 ajax 请求无效
【发布时间】:2014-04-23 13:54:41
【问题描述】:

您好,我正在使用 symfony2 和 AngularJS 开发应用程序。我有一个表格,我通过邮寄使用 $http 服务发送。例如登录表单和注册表单。

我得到的错误是经典的 CSRF 令牌无效,并且在重新提交表单时发生。

第一次表单提交过程顺利,用户登录或注册;但如果我注销并尝试重新提交具有相同数据的表单以再次登录,我会收到无效 csrf 令牌的错误。

如果表单提交时尝试重新生成令牌:

$this->get('form.csrf_provider')->generateCsrfToken('authenticate');

并在视图上将其替换为下一次表单将有一个新令牌要发送,但我得到了同样的错误。

我做错了什么?

【问题讨论】:

  • 是否需要为每个请求重新渲染表单?
  • 不,它的想法是表单始终存在或显示或隐藏在用户菜单的登录包装 div 中,它将根据用户的登录状态隐藏或显示
  • 您是否检查过请求之间的 CSRF 令牌是否真的发生了变化?
  • 是的,我检查是否在成功请求后发送了一个新令牌,并在表单上的 _token 字段上进行了更改,但是由于某种原因,当我再次发送表单时,symfony 期望另一个令牌不同于第一次使用的时间并且请求中生成的新的

标签: php ajax forms angularjs symfony


【解决方案1】:

我知道您很久以前就问过这个问题,但今天我遇到了同样的问题,解决方案非常简单。如果您使用其他节点呈现表单,请确保 form_start 与 form_end 位于同一节点中。 就我而言,它看起来像这样:

<div>
{{form_start(form)}}
... some form inputs
</div>
{{form_end(form)}}

您可能知道 form_end 呈现令牌(在最新的 Symfony 中),因此,令牌在表单之外。

当您尝试重新呈现表单时会发生这种情况,我猜这是因为您有其他用于重新呈现表单的模板(例如有错误),因此请确保您的 HTML 层次结构有效。

希望它对将来的某人有所帮助。干杯!

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 1970-01-01
    • 2012-12-15
    • 2016-08-21
    • 1970-01-01
    • 2020-01-31
    • 2015-08-04
    • 2018-02-22
    • 2018-06-09
    相关资源
    最近更新 更多