使用Laravel和Vue.js构建一个小的 SPA 时遇到了CSRF的多个困难:
index.html
作为唯一视图,其余视图由vue-router
使用单个文件组件(即.vue
文件)处理csrf_token()
注入到我的视图中。即使我这样做了,令牌也会最终到期,但由于应用程序没有(或很少)页面刷新,它不知道令牌是否发生了变化,并且它最终无法用旧的方式发出AJAX请求令牌考虑到最后两点,您认为在Laravel SPA中使用CSRF令牌是否必要/可取?如果是这样,最好的实现是什么(带有令牌的cookie,返回令牌的专用路由,或其他)?如果没有,有哪些替代方案?
答案 0 :(得分:5)
评论没有足够的空间,所以我将其添加为答案,但这只是一个概念,因为我对Vue的体验非常低。
// Add a request interceptor
axios.interceptors.request.use(function (config) {
// Do something before request is sent
return config;
}, function (error) {
// Do something with request error
return Promise.reject(error);
});
// Add a response interceptor
axios.interceptors.response.use(function (response) {
// Do something with response data
return response;
}, function (error) {
// Do something with response error
return Promise.reject(error);
});
所以概念就是这样:
发出请求时,拦截它并从全局存储中添加CSRF令牌
axios.interceptors.request.use(function(config){ //从存储它的地方获取令牌并添加到请求中 });
拦截响应并存储新令牌
axios.interceptors.response.use(function(response){ //将新的CSRF令牌存储在存储第一个令牌的同一位置。 });
永远循环