You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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_credentialstrue),并确保Sanctum的stateful数组包含前端域名
  • Breeze默认的登录/注册是Laravel的Blade页面,如果你想把登录也改成Vue组件,可以参考Breeze的API版本改造

内容的提问来源于stack exchange,提问作者Riza Khan

火山引擎 最新活动