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

Laravel Sanctum Cookie因Domain属性被浏览器拒绝问题求助

跨Cloud Run容器部署Laravel Sanctum + VueJS的Cookie配置问题排查与解决

问题场景

  • Laravel后端(集成Sanctum)部署在Cloud Run,地址:ice-bear-backend-abcde-ey.a.run.app
  • VueJS前端部署在Cloud Run,地址:ice-bear-frontend-abcde-ey.a.run.app
  • 当前Laravel配置:
    SANCTUM_STATEFUL_DOMAINS=ice-bear-frontend-abcde-ey.a.run.app
    SESSION_DOMAIN=.run.app
    
  • 浏览器拒绝后端返回的Cookie,报错:
    • Firefox:Cookie "XSRF-TOKEN"因无效域名被拒绝
    • Chrome:通过Set-Cookie头设置Cookie的尝试因Domain属性与当前主机URL不匹配被阻止

问题根源

run.app属于浏览器公共后缀列表(Public Suffix List)中的顶级公共后缀,浏览器会阻止设置针对公共后缀或其泛域名(如.run.app、.a.run.app)的Cookie,防止恶意网站跨域滥用Cookie权限。之前尝试的.run.app或前端域名都不符合浏览器的Cookie安全规则。

解决方案

1. 修正Laravel环境变量配置

更新.env文件如下:

# 保留前端域名,允许其作为有状态域名访问Sanctum
SANCTUM_STATEFUL_DOMAINS=ice-bear-frontend-abcde-ey.a.run.app
# 设置为后端完整域名,或留空让Laravel自动适配当前请求主机
SESSION_DOMAIN=ice-bear-backend-abcde-ey.a.run.app
# 强制开启Secure(Cloud Run默认HTTPS,必须开启才能在HTTPS环境下生效)
SESSION_SECURE_COOKIE=true
# 根据跨域场景选择:前端与后端完全跨域时设为none,同主域下可设为lax
SESSION_SAME_SITE=none
# 确保SESSION_DRIVER用database或file,避免Cookie存储异常
SESSION_DRIVER=database

2. 配置CORS允许携带凭证

修改config/cors.php文件,确保支持跨域携带Cookie:

return [
    'paths' => ['api/*', 'sanctum/csrf-cookie', 'login', 'logout'],
    'allowed_origins' => ['https://ice-bear-frontend-abcde-ey.a.run.app'],
    'allowed_origins_patterns' => [],
    'allowed_methods' => ['*'],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 0,
    // 关键:开启允许携带凭证(Cookie)
    'supports_credentials' => true,
];

3. 前端请求配置

在VueJS中确保所有请求携带Cookie,以Axios为例:

import axios from 'axios';

// 全局配置允许携带凭证
axios.defaults.withCredentials = true;
axios.defaults.baseURL = 'https://ice-bear-backend-abcde-ey.a.run.app';

// 发送请求前先获取CSRF Cookie
async function initCsrf() {
    await axios.get('/sanctum/csrf-cookie');
}

// 登录请求示例
async function login(email, password) {
    await initCsrf();
    return axios.post('/login', { email, password });
}

4. 验证配置生效

  1. 打开浏览器开发者工具(F12),切换到Network标签
  2. 触发前端请求(如登录),查看sanctum/csrf-cookie请求的响应头,确认Set-Cookie中的Domain为后端完整域名,且包含Secure、SameSite=None(或对应设置)属性
  3. 切换到Application标签,在Cookies下找到后端域名,确认XSRF-TOKEN和laravel_session已成功存储

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:31:14