如何使用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
相关产品推荐
相关产品推荐

