Vue.js+Laravel会话认证:升级PHP8后登录出现No token错误
问题描述
我将Laravel应用从PHP@7升级到PHP@8后,登录功能失效。后台管理系统是基于Vue.js(Vue2)的SPA(使用VueRouter、Vuex等),后端Laravel采用会话认证(非API令牌)。通过默认Laravel登录表单登录后,会话已正常创建,但Vue SPA页面抛出“Uncaught (in promise) No token”错误。经排查,问题出在actions.js中的inititApp函数:该函数会从localStorage获取access_token,若不存在则返回Promise.reject('No token')。目前已在app.js中开启Vue.http.options.credentials = true,现咨询:如何修改inititApp以适配Laravel会话认证?是否可直接移除令牌检查,或有更安全的推荐方案?
解决方案
1. 别直接移除令牌检查
直接删掉令牌检查的话,未登录用户能直接进入需要权限的页面,等于完全失去了认证校验的作用,绝对不可行。
2. 改成基于会话的校验逻辑
既然用的是Laravel会话认证,就该靠后端的会话状态判断用户是否登录,而非依赖localStorage里的token。把inititApp改成向后端发起一个校验登录状态的请求即可,示例如下:
// actions.js 中修改后的 inititApp 函数 async inititApp({ commit }) { try { // 向后端发送会话校验请求,接口需自行在Laravel中配置 const res = await Vue.http.get('/api/check-login'); // 请求成功代表已登录,将用户信息存入Vuex commit('SET_USER_INFO', res.data); return Promise.resolve(); } catch (err) { // 请求失败(如401未授权)代表未登录,抛出错误或直接跳转登录页 return Promise.reject('未登录,请先登录'); } }
3. 后端配套配置要跟上
- 你已经开启的
Vue.http.options.credentials = true是正确的,这能让浏览器自动携带会话Cookie - Laravel的
config/cors.php里要将supports_credentials设为true,同时allowed_origins不能写*,必须指定你的SPA域名(比如http://localhost:8080) - 后端的校验接口要加上
auth:web中间件,示例路由(在routes/api.php中):
Route::middleware('auth:web')->get('/check-login', function (\Illuminate\Http\Request $request) { return $request->user(); });
4. 额外安全优化建议
- 给VueRouter添加导航守卫,结合Vuex中的用户状态,拦截未登录用户访问权限页面
- 后端所有需要权限的接口,统一使用
auth:web中间件做认证校验 - 前端不要存储任何敏感信息,用户信息仅存放在Vuex中,刷新页面时通过
inititApp重新拉取
内容的提问来源于stack exchange,提问作者JeRmiZa
相关产品推荐
相关产品推荐

