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

Vue3 SPA子域名场景下Sanctum认证失效问题咨询

问题原因

你当前配置的SANCTUM_STATEFUL_DOMAINS仅硬编码了umer.localhost的两个端口到Sanctum有状态域名白名单,动态生成的test.localhost等其他子域名不在白名单范围内,Sanctum会将这类请求判定为跨域无状态请求,不会读取session完成认证,这是子域名场景下认证失败的核心原因。

修复步骤
  • 调整.env配置参数
    保留原有正确的SESSION_DOMAIN配置,修改SANCTUM_STATEFUL_DOMAINS覆盖所有子域名场景。Laravel 8.5.10及以上版本支持前缀.的通配符匹配规则,可以匹配所有对应端口下的子域名,配置参考如下:
    SESSION_DOMAIN=.localhost
    SANCTUM_STATEFUL_DOMAINS=localhost,localhost:8000,localhost:3000,.localhost,.localhost:8000,.localhost:3000
    

    注意:必须同时把根域名localhost加入白名单,避免根路径认证失效;如果你的本地服务运行在80/443默认端口,直接删掉对应带端口的配置项即可,端口不匹配会导致规则校验失败。

  • 清除配置缓存
    配置修改后执行以下命令清除旧的配置缓存,避免修改不生效:
    php artisan config:clear
    php artisan route:clear
    php artisan cache:clear
    
  • 核对跨域与中间件配置
    1. 打开config/cors.php,确认supports_credentials参数值为true,如果前端是单独部署的SPA项目,需要给axios请求全局开启withCredentials: true配置,保证跨域请求会携带认证cookie。
    2. 打开app/Http/Kernel.php,确认api中间件组中EnsureFrontendRequestsAreStateful中间件放在所有其他中间件的最靠前位置,参考配置如下:
    'api' => [
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
    

完成以上配置后,所有*.localhost下的子域名访问都会被Sanctum识别为有状态请求,动态生成的子域名就可以正常完成认证了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:01:10