【问题标题】:Laravel CSRF token empty in AJAX-rendered contentLaravel CSRF 令牌在 AJAX 渲染内容中为空
【发布时间】:2018-01-19 09:15:10
【问题描述】:

"laravel/framework": "5.4.*", "laravelcollective/html": "^5.4",

我有一个包含删除按钮的视图部分,并且通过正常和 AJAX 请求呈现。在后者之后,这些按钮的表单在呈现部分时没有获得 CSRF 令牌。隐藏的输入值为空,导致后续使用时出现TokenMismatchException

请注意,这些按钮的表单不使用 AJAX。 我的问题与告诉 javascript 从元标记中获取令牌并将其包含在 AJAX 请求中无关。这很好用。这些表格是按照正常的、老式的要求提交的。 (删除后页面重新加载时,内容会加载到正确的页面。)

导致新部分被渲染的分页请求会发送到 API 命名空间中的控制器。因此,我尝试将“web”中间件添加到 api.php 中的路由:

Route::middleware(['auth:api', 'web']) ...

这确实导致令牌值出现在删除表单中。然而,正如我很确定会发生的那样,它与之前在元标记中设置的不匹配。

令牌被传递给 FormBuilder 的构造函数。我可以在控制器中(在分页请求上)做些什么来将令牌传递给 View,这样它最终会在部分渲染之前被传递给 FormBuilder? (我不清楚 FormBuilder 实例化的位置/时间。)

另一个想法可能是将令牌包含在分页请求中,将其作为视图变量从控制器传递,然后手动创建令牌输入。 (有一些逻辑只针对 ajax 请求。)

不过,这似乎很老套。在追求它之前,我想进一步考虑一下,并希望有人可能对如何实现前一个(或更好的)解决方案有所了解。

【问题讨论】:

    标签: laravel-5 csrf


    【解决方案1】:

    我想到了一个非常简单的解决方案,尽管它不是 Laravel 特有的。我能做的是让分页组件从元标记中获取令牌,然后检查传入的 html 片段是否存在任何 _token 隐藏字段并根据需要应用该值。

    【讨论】:

      猜你喜欢
      • 2017-05-27
      • 2014-05-01
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 2017-01-25
      • 1970-01-01
      相关资源
      最近更新 更多