调用带auth:sanctum的API返回302并重定向至首页问题求助
解决Laravel Sanctum API返回302重定向问题
问题核心
调用auth:sanctum保护的API时返回302,本质是后端没正确识别这是API请求,误触发了Web路由的认证重定向逻辑。以下是针对性解决方法:
1. 修正前端Inertia请求头
Inertia请求需要明确告知后端这是API/AJAX请求,避免触发Web端的重定向规则:
<script setup lang="ts"> import { router } from "@inertiajs/vue3"; router.get('/api/books', { headers: { 'Accept': 'application/json', 'X-Requested-With': 'XMLHttpRequest', 'X-XSRF-TOKEN': document.cookie.match(/XSRF-TOKEN=([^;]+)/)?.[1] || '' } }) </script>
X-Requested-With:告诉Laravel这是AJAX请求,不返回重定向X-XSRF-TOKEN:携带Sanctum需要的CSRF令牌(Inertia通常自动携带,手动添加更稳妥)
2. 配置Sanctum信任域名
打开config/sanctum.php,确保你的开发域名在stateful列表中:
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( '%s%s', 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : '' ))),
同时在.env中设置正确的应用地址:
APP_URL=http://localhost:8000 SANCTUM_STATEFUL_DOMAINS=localhost:3000,localhost:8000
3. 确认API路由中间件组
打开app/Providers/RouteServiceProvider.php,确保API路由使用api中间件组,而非web:
protected function mapApiRoutes() { Route::prefix('api') ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api.php')); }
web中间件包含会话重定向逻辑,API路由必须用api中间件组,才能让auth:sanctum返回401而非302。
4. 恢复RedirectIfAuthenticated.php
不要修改这个文件,它是给Web路由用的。API路由的认证失败逻辑由auth:sanctum处理,只要请求被正确识别为API请求,就会返回401而非重定向。
验证步骤
- 登录后检查浏览器Cookie,确认存在
laravel_session和XSRF-TOKEN - 发送请求时查看开发者工具的请求头,确认上述配置的Header已携带
- 正常情况下会返回200状态码和JSON格式的书籍数据
内容的提问来源于stack exchange,提问作者fjduqrllhdnolvgrcc
相关产品推荐
相关产品推荐

