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

Laravel Passport+VueJS环境下Blade中Auth::User()无法获取已认证用户

问题原因分析

你遇到的核心问题是Laravel的Web会话认证和Passport API令牌认证是两套完全独立的系统:

  • 前端Vuex里用的是Passport的Bearer Token认证,对应后端的auth:api中间件,它通过请求头里的Token识别用户,不依赖Session;
  • 而Blade模板里的@auth指令、Auth::user()方法默认使用的是Web端的Session Cookie认证,对应web中间件,它只认Session里的登录状态,和API Token完全不共享。

所以哪怕前端已经用Token认证成功,后端的Web会话里还是处于未登录状态,Blade自然拿不到用户信息。


两种解决方案

根据你的场景需求,推荐两种不同的处理方式:

方案一:在Blade中通过API请求获取用户(推荐前后端分离场景)

既然你已经有了/auth/user这个能通过auth:api返回用户的接口,直接在Blade里用axios发起请求获取用户即可——因为你已经在Vuex里给axios全局设置了Authorization头,这个请求会自动带上Token,后端能正确识别。

修改Blade里的脚本部分:

<script>
// 初始化用户变量
window.User = [];

// 发起API请求获取已认证用户
axios.get('/auth/user')
  .then(response => {
    window.User = response.data;
  })
  .catch(() => {
    // 未登录时保持空数组
    window.User = [];
  });
</script>

这种方式不需要改动后端会话逻辑,完全基于API认证体系,适合前后端分离程度较高的项目。

方案二:同步API认证状态到Web会话(适合需要在Blade直接用Auth的场景)

如果你必须在Blade里使用@auth或Auth::user(),可以在前端登录成功后,额外请求一个Web路由,把用户信息同步到Web会话中:

1. 添加Web同步路由

在routes/web.php中新增一个路由,用web中间件处理:

use Illuminate\Http\Request;

Route::post('/sync-web-auth', function(Request $request) {
    // 通过前端传入的用户ID查找用户
    $user = \App\Models\User::find($request->user_id);
    
    if ($user) {
        // 将用户登录到Web会话
        auth()->login($user);
        return response()->json(['success' => true]);
    }
    
    return response()->json(['success' => false], 401);
})->middleware('web');

2. 修改Vuex的login Action

在登录成功后,新增同步请求:

login({ commit}, user) {
  return new Promise((resolve, reject) => {
    let url = `/auth/login`;
    let email = user.email;
    let password = user.password;
    axios.post(url, { email, password })
      .then(response => {
        const token = response.data.token
        const user = response.data.user
        localStorage.setItem('AnimeStock.jwt', 'Bearer '+ token);
        localStorage.setItem('AnimeStock.user', JSON.stringify(user));
        axios.defaults.headers.common['Authorization'] = 'Bearer '+ token;
        
        // 新增:同步API认证状态到Web会话
        axios.post('/sync-web-auth', { user_id: user.id }, {
          // 同域下可省略,跨域场景需要开启withCredentials
          withCredentials: true
        }).then(() => {
          console.log('Web会话同步成功');
        }).catch(syncErr => {
          // 同步失败不影响前端认证,仅Blade无法获取用户
          console.warn('Web会话同步失败', syncErr);
        });
        
        commit('AUTH_SUCCESS', {token, user});
        resolve(response);
      })
      .catch(error => {
        console.log(error)
        commit('AUTH_ERROR', error.response.data.error)
        localStorage.removeItem('AnimeStock.jwt')
        localStorage.removeItem('AnimeStock.user')
        reject(error)
      })
  })
}

完成后,Blade里的@auth和Auth::user()就能正常获取到用户了,因为Web会话已经和API认证状态同步。


内容的提问来源于stack exchange,提问作者Skykid Felix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:05:03