我使用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。
任何帮助都将不胜感激。
感谢。
答案 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,我唯一一次做一个实际的传统表单提交是在登录或注销序列期间(所以整页刷新)。剩下的时间它只是使用相同令牌的同一页面。