Laravel Sanctum Cookie因Domain属性被浏览器拒绝问题求助
问题场景
- 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. 验证配置生效
- 打开浏览器开发者工具(F12),切换到Network标签
- 触发前端请求(如登录),查看
sanctum/csrf-cookie请求的响应头,确认Set-Cookie中的Domain为后端完整域名,且包含Secure、SameSite=None(或对应设置)属性 - 切换到Application标签,在
Cookies下找到后端域名,确认XSRF-TOKEN和laravel_session已成功存储
内容的提问来源于stack exchange,提问作者beatcraft
相关产品推荐
相关产品推荐

