Laravel Vue3项目:如何将用户Token及登录信息传递至Vue3应用
如何在Laravel Breeze + Vue3 SPA中传递用户Token和登录信息
嘿,我刚好做过类似的配置,用Laravel Breeze配合Vue3 SPA传递用户信息和Token其实挺顺手的,给你两个实用方案:
方案一:通过Blade模板注入全局变量(最直接)
因为你的dashboard.blade.php是由Laravel渲染的,所以可以直接在模板里嵌入脚本,把用户数据和Token挂载到window对象上,让Vue能直接访问:
步骤1:在Blade模板中注入数据
修改你的dashboard.blade.php,在<div id="app"></div>前后添加这段脚本:
<x-app-layout> <script> // 注入当前登录用户信息 window.currentUser = @json(auth()->user()); // 注入CSRF Token(用于POST/PUT/DELETE请求) window.csrfToken = '{{ csrf_token() }}'; // 如果需要API Token(比如用Sanctum的令牌认证),可以生成并注入 @auth window.apiToken = '{{ auth()->user()->createToken('spa-access')->plainTextToken }}'; @endauth </script> <div id="app"></div> </x-app-layout>
步骤2:在Vue中配置Axios
在你的app.ts或者单独的Axios配置文件里,设置默认请求头,自动带上Token:
import { createApp } from 'vue'; import App from './App'; import axios from 'axios'; // 配置CSRF Token axios.defaults.headers.common['X-CSRF-TOKEN'] = window.csrfToken; // 配置API Token(如果用了方案里的apiToken) if (window.apiToken) { axios.defaults.headers.common['Authorization'] = `Bearer ${window.apiToken}`; // 可选:把Token存到localStorage,页面刷新时不用重新生成 localStorage.setItem('spa_token', window.apiToken); } // 如果页面刷新,从localStorage恢复Token const savedToken = localStorage.getItem('spa_token'); if (savedToken) { axios.defaults.headers.common['Authorization'] = `Bearer ${savedToken}`; } createApp(App).mount('#app');
方案二:用Laravel Sanctum SPA认证(更规范,适合同域名场景)
如果你的SPA和Laravel后端在同一个域名下,用Sanctum的会话认证更安全,不需要手动管理Token——Axios会自动携带会话Cookie,后端直接识别登录用户。
步骤1:配置Axios允许携带凭证
在app.ts里开启Axios的withCredentials:
import axios from 'axios'; axios.defaults.withCredentials = true;
步骤2:添加API路由获取用户信息
在routes/api.php中添加一个获取当前用户的路由,用auth中间件(因为Breeze的Web认证是会话模式):
use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; Route::middleware('auth')->get('/user', function (Request $request) { return $request->user(); });
步骤3:在Vue中初始化用户信息
在你的App.vue组件里,发起请求获取用户信息,确保用户已登录:
<script setup lang="ts"> import { ref, onMounted } from 'vue'; import axios from 'axios'; const currentUser = ref(null); onMounted(async () => { try { const response = await axios.get('/api/user'); currentUser.value = response.data; } catch (error) { // 如果未登录,跳转到Laravel的登录页 window.location.href = '/login'; } }); </script> <template> <div v-if="currentUser"> <!-- 你的SPA内容 --> <p>欢迎回来,{{ currentUser.name }}!</p> </div> <div v-else> 加载中... </div> </template>
额外注意事项
- 如果用方案一的API Token,记得在用户注销时销毁Token:在Vue中调用后端接口撤销令牌,同时清除localStorage的Token
- 跨域场景下,需要配置Laravel的CORS(在
config/cors.php中设置supports_credentials为true),并确保Sanctum的stateful数组包含前端域名 - Breeze默认的登录/注册是Laravel的Blade页面,如果你想把登录也改成Vue组件,可以参考Breeze的API版本改造
内容的提问来源于stack exchange,提问作者Riza Khan




