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

使用Laravel Sanctum时JS Fetch请求API无法识别登录用户如何解决

解决步骤

1. 修正认证驱动配置

你当前config/auth.php里的api guard默认用的是原生token驱动,没有适配Sanctum,修改如下:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'sanctum', // 替换原有token驱动
        'provider' => 'users',
        'hash' => false,
    ],    
],

修改完成后执行php artisan config:clear清除配置缓存生效。

2. 给API路由组增加会话状态校验中间件

打开app/Http/Kernel.php,在api中间件组中加入Sanctum的前端请求状态校验中间件,保证同域名请求可以正常读取登录会话:

protected $middlewareGroups = [
    'web' => [
        // 原有web中间件保持不变
    ],
    'api' => [
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, // 新增该行
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];

同时确认.env文件中SANCTUM_STATEFUL_DOMAINS配置了你的站点域名,例如本地开发时可填localhost:8000,多域名用逗号分隔即可。

3. 修正Fetch请求配置,携带会话Cookie

浏览器默认fetch请求不会自动携带同站Cookie,需要新增credentials参数才能把登录会话传给后端:

let fetchData = {
    method: 'POST',
    body: formData,
    credentials: 'include', // 新增该行
    headers: new Headers({
        'X-CSRF-TOKEN': document.getElementsByName('_token')[0].value
    })
}

4. 修复Controller代码语法错误

原有代码存在赋值符号错误、变量不统一的问题,修正后如下:

if (auth()->check()) {
    $data['user'] = auth()->user()->name;
} else {
    $data['user'] = 'guest';
}

Model::create($data);

如果需要明确指定guard,可以写成auth('sanctum')->user(),配置正确的前提下直接用auth()->user()也可正常读取用户信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:45:03