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

Laravel Sanctum SPA认证调用session()->regenerate()报错咨询

问题根因

你遇到的Session store not set on request报错核心是对Sanctum的EnsureFrontendRequestsAreStateful中间件作用理解有偏差:

  • 这个中间件本身不负责启动Session,它的唯一作用是校验请求是否来自sanctum.php配置中stateful列表里的受信任第一方域名,如果是,就动态将当前请求的认证守卫切换为支持Cookie/Session的Web守卫,允许请求透传Cookie完成认证,它本身没有初始化Session存储的能力。
  • Laravel默认的api中间件组是为无状态Token认证设计的,默认不会加载StartSession、Cookie加密、CSRF校验这些Web路由组自带的状态化处理中间件。哪怕你把Sanctum的中间件放在api组最前面,没有启动Session的核心中间件,请求实例上根本不会绑定Session存储,调用$request->session()就会直接抛出你看到的RuntimeException。

网上提到的把StartSession加到全局中间件数组的方案属于野路子,虽然能临时解决问题,但会让所有API请求(包括给第三方调用的纯Token认证接口)都启动Session,违背API无状态的设计原则,还会带来不必要的性能开销,官方文档没提这个方案就是因为它不是正确做法。

修复方案

根据你的业务场景二选一即可:

方案1:全API组支持SPA Session认证(适合项目所有API都是给自身Nuxt SPA服务的场景)

直接修改app/Http/Kernel.php中的api中间件组,补全状态化依赖的中间件,注意顺序不能乱:

'api' => [
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    // 补全以下Cookie、Session相关核心中间件
    \Illuminate\Cookie\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'throttle:api',
],

方案2:单独拆分SPA认证路由组(推荐,适合同时提供对外Token API的场景)

不要修改默认api中间件组,在$middlewareGroups中新增一个专门给第一方SPA用的中间件组:

'spa' => [
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    \Illuminate\Cookie\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'throttle:api',
],

然后把CSRF获取、登录、登出、所有给Nuxt SPA调用的接口都路由到这个spa中间件组下,纯对外的Token接口依然使用默认的无状态api中间件组即可,不会互相干扰。

配套校验项

配置完中间件后还要确认以下配置正确,否则依然会出现认证异常:

  • 检查config/sanctum.php的stateful数组,已经把Nuxt前端的域名+端口(比如localhost:3000、app.yourdomain.com)加入列表,否则Sanctum不会将请求判定为第一方请求,不会启用Cookie认证逻辑
  • Nuxt侧的请求客户端必须开启withCredentials: true配置,确保跨域请求时会携带Cookie
  • 跨域配置(config/cors.php)中要把supports_credentials设为true,允许跨域请求返回Cookie
  • 必须先请求/sanctum/csrf-cookie接口完成CSRF Cookie初始化,再发起登录请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:57:13