You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 18:12:32