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

Laravel Sanctum多租户SPA环境CSRF Cookie域名无效问题求助

解决多租户子域名下Laravel Sanctum 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:40:08