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 - 核对跨域与中间件配置
- 打开
config/cors.php,确认supports_credentials参数值为true,如果前端是单独部署的SPA项目,需要给axios请求全局开启withCredentials: true配置,保证跨域请求会携带认证cookie。 - 打开
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
相关产品推荐
相关产品推荐

