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

如何使用Laravel Breeze授权Axios请求?已登录仍提示未认证

解决Laravel Breeze + Axios API请求未认证问题

1. 检查API路由的认证中间件

Laravel Breeze的web路由使用auth中间件,但API接口默认需要auth:sanctum中间件校验。打开routes/api.php,确认你的/api/messages路由是否正确配置:

Route::get('/messages', [MessageController::class, 'index'])->middleware('auth:sanctum');

2. 配置Sanctum状态域与Session域名

在项目根目录的.env文件中,确保SESSION_DOMAIN和SANCTUM_STATEFUL_DOMAINS与你的开发环境匹配(Sail默认使用localhost):

SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost,127.0.0.1:8000,localhost:3000

把前端运行的端口(比如3000)也加入到SANCTUM_STATEFUL_DOMAINS列表中。

3. 完善Axios的CSRF令牌配置

虽然已经开启了withCredentials,还需要确保Axios携带CSRF令牌:

  • 在前端页面的<head>里添加CSRF元标签:
<meta name="csrf-token" content="{{ csrf_token() }}">
  • 在bootstrap.js中补充令牌配置:
axios.defaults.withCredentials = true;
axios.defaults.headers.common['X-XSRF-TOKEN'] = document.querySelector('meta[name="csrf-token"]').getAttribute('content');

4. 调整跨域CORS配置

如果前端和后端是跨域部署,修改config/cors.php:

'paths' => ['api/*', 'sanctum/csrf-cookie'],
'allowed_methods' => ['*'],
'allowed_origins' => ['http://localhost:3000'], // 替换为你的前端地址
'allowed_headers' => ['*'],
'supports_credentials' => true,

重点确保supports_credentials设为true,否则Cookie无法跨域传递。

5. 跨域场景先获取CSRF令牌

如果是跨域请求,需要先调用/sanctum/csrf-cookie接口获取令牌,再发送业务请求:

axios.get('/sanctum/csrf-cookie').then(() => {
    axios.get('/api/messages');
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:20:47