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
相关产品推荐
相关产品推荐

