Laravel Sanctum多租户SPA环境CSRF Cookie域名无效问题求助
核心问题分析
浏览器拒绝Cookie的原因是localhost的特殊域名规则:现代浏览器对.localhost的Cookie处理有严格限制,尤其是跨端口场景下,子域名foo.localhost:8000设置的.localhost域名Cookie无法被localhost:5500识别。
分步解决方案
1. 调整环境变量配置
修改.env文件,适配本地多租户跨端口场景:
SESSION_DOMAIN= SANCTUM_STATEFUL_DOMAINS=localhost:5500,foo.localhost:8000
说明:留空
SESSION_DOMAIN后,Laravel会自动根据当前请求的域名动态设置Cookie的Domain属性,完美适配多租户子域名,同时解决跨端口的Cookie识别问题。
2. 配置stancl/tenancy会话域
在config/tenancy.php中确保会话域随租户动态生成:
// config/tenancy.php 'session' => [ 'domain' => null, // 交由Laravel自动处理 ],
3. 完善CORS配置
修改config/cors.php,开启凭证支持并指定合法来源:
// config/cors.php return [ 'paths' => ['*'], 'allowed_methods' => ['*'], 'allowed_origins' => ['http://localhost:5500'], 'allowed_headers' => ['*'], 'supports_credentials' => true, // 必须开启,否则跨域无法携带Cookie ];
4. 验证请求配置
保持你的Axios配置不变,确保withCredentials已启用:
axios.defaults.withCredentials = true; axios.defaults.withXSRFToken = true; var baseUrl = 'http://foo.localhost:8000'; axios.get(`${baseUrl}/sanctum/csrf-cookie`, { headers: { 'Accept': 'application/json' } }) .then((response) => { console.log(response); }) .catch(error => { console.error('Failed to set CSRF cookie:', error); });
5. 清理浏览器缓存
完成配置后,务必清除浏览器的Cookie和缓存,避免旧的无效Cookie干扰验证结果。
方案生效逻辑
- 留空
SESSION_DOMAIN让Laravel自动匹配当前请求的租户域名(foo.localhost),生成符合浏览器规则的Cookie,解决跨端口识别问题。 SANCTUM_STATEFUL_DOMAINS同时包含SPA和租户域名,确保Sanctum识别合法的状态请求来源。- 开启
supports_credentials是跨域请求携带Cookie的必要前提。
内容的提问来源于stack exchange,提问作者oghenemavo
相关产品推荐
相关产品推荐

