使用SPA

时间:2017-01-23 23:06:24

标签: laravel vue.js csrf

我使用Vue js作为SPA,使用Laravel作为后端。一切正常但是一旦提交了表单,crsf令牌显然没有刷新,所以当我去提交另一个表单时,我得到TokenMismatchException

我无法将csrf令牌放入表单中,因为当表单是vue中的一个组件时,vue会在尝试呈现时抛出错误。

我可以使用vue的默认公共标头通过搜索name=_token来访问csrf令牌,该TokenMismatchException将在第一个请求中起作用,但在Laravel将返回Dim credential As UserCredential = GoogleWebAuthorizationBroker.AuthorizeAsync(gclientsecrets, gscopes, "mysecretcalendar@gmail.com", CancellationToken.None).Result 作为令牌后的任何请求上最近被当前登录的用户使用过。

我需要找到一种方法,以便可以刷新令牌而无需刷新页面,因为它不会成为SPA。

任何帮助都将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用csrf标记值创建局部变量,并将其分配给窗口(在主布局刀片文件中):

<script>
window.AppSettings = {
    csrfToken: "{{ csrf_token() }}"
}
</script>

然后在您的axios / vue-resource请求中使用它:

axios.post("/some/path", { my: data, _token: AppSettings.csrfToken })
  .then(response => {
      console.log(response.data);
  })

其他解决方法(根本不推荐)是在中间件中禁用它

app/Http/Middleware/VerifyCsrfToken.php

中的

protected $except = [
    "your/path/to/ignore"
];

但我会选择第一个选项。

答案 1 :(得分:0)

你的设置中有一些时髦的东西,可能是Vue的一些配置,因为你的第二个陈述有点偏离:

  

我可以使用vue的默认公共标题来访问csrf标记   搜索name = _token,它将在第一个请求上工作但是在   Laravel之后的任何请求都会返回TokenMismatchException   最近由当前登录的用户使用了令牌。

以上情况并非如此,除非他们已注销并重新登录,否则您可以继续使用相同的令牌。

我现在正在用Laravel作为后端构建几个SPA,我唯一一次做一个实际的传统表单提交是在登录或注销序列期间(所以整页刷新)。剩下的时间它只是使用相同令牌的同一页面。