【发布时间】:2017-10-29 03:16:51
【问题描述】:
在使用 Laravel 和 Vue.js 构建一个小型 SPA 时,我在使用 CSRF 时遇到了很多困难:
- 我使用
index.html作为唯一视图,其余部分由vue-router使用单个文件组件(即.vue文件)处理 - 因为我没有在前面使用 PHP 或 Blade,我无法将
csrf_token()注入到我的视图中。即使我这样做了,令牌最终也会过期,但是由于应用程序没有(或很少)页面刷新,它不会知道令牌是否更改,并且最终无法使用旧的 AJAX 请求令牌 - Some answers 建议将令牌传递到 cookie 中,然后用 JS 检索。这种方法存在与上述相同的问题——令牌更改时永远不会通知 SPA
- 我可以挖掘 Laravel 的内部工作原理,并在每次令牌更改时抛出一个事件;前端可以使用Laravel Echo 来监听变化,但是问题来了,这还值得费心吗?
- 最后,有人建议我使用 JWT;但是,据我了解,JWT 用于身份验证,而 CSRF 用于每个请求,无论 HTTP 动词或意图如何。
考虑到最后两点,你认为在 Laravel SPA 中使用 CSRF 令牌是否必要/可取?如果是这样,最好的实现是什么(带有令牌的 cookie、返回令牌的专用路由或其他)?如果没有,有什么替代方案?
【问题讨论】:
-
只是关于你的第三条的想法:如果 Laravel 通过 cookie 更改 CSRF 令牌并且你在 Vue 上有一个
interceptor将始终检索 cookie,它是否仍会检索旧的 CSRF,因为页面没有重装?浏览器不会收到ajax请求的cookie变化吗? -
另一个想法:你可以让 Laravel 在每个被 Vue 拦截的请求上添加一个自定义的 HTTP Header 并将其存储起来以供下一个请求使用。应用程序使用 Blade 传递的有效 CSRF 启动。第一个 Ajax 将包含接下来应该使用的令牌。
-
@MarcoAurélioDeleu 你能用拦截器扩展你的想法吗?我相信它需要
vue-resource包,它实际上已被 Vue 2.0 中的 Axios 取代?你能举一个代码例子吗?将不胜感激
标签: laravel csrf laravel-5.4