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

