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

调用带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而非重定向。


验证步骤

  1. 登录后检查浏览器Cookie,确认存在laravel_session和XSRF-TOKEN
  2. 发送请求时查看开发者工具的请求头,确认上述配置的Header已携带
  3. 正常情况下会返回200状态码和JSON格式的书籍数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:45:13