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

生产环境下Vue SPA与Laravel Sanctum的CSRF不匹配问题

解决Laravel Sanctum跨域CSRF 419错误(生产环境)

问题背景

Vue SPA部署在domain.co.uk,Laravel API部署在api.domain.co.uk,POST请求时出现419 CSRF不匹配错误。已确认sanctum/csrf-cookie请求成功,XSRF-TOKEN和laravel_session Cookie已设置,但请求未自动携带X-XSRF-TOKEN请求头;本地环境(localhost端口分离)配置相同可正常运行,手动设置请求头也无效。

解决方案

1. 强制配置Axios的XSRF参数

Axios默认会自动从XSRF-TOKEN Cookie提取值并设置X-XSRF-TOKEN请求头,但跨域场景下可能因域名配置失效,需手动指定参数:

axios.defaults.withCredentials = true;
axios.defaults.baseURL = 'https://api.domain.co.uk/';
// 明确指定XSRF的Cookie名称和请求头名称
axios.defaults.xsrfCookieName = 'XSRF-TOKEN';
axios.defaults.xsrfHeaderName = 'X-XSRF-TOKEN';

2. 优化API请求代码(消除冗余嵌套)

原代码存在不必要的Promise嵌套,简化后更易排查问题,同时确保请求前已正确获取CSRF:

export default class Api {
    async getCSRF() {
        await axios.get('sanctum/csrf-cookie');
    }
    
    async login(email, password) {
        await this.getCSRF();
        const response = await axios.post('login', { email, password });
        return response.data;
    }
}

3. 检查Laravel CORS配置

确保config/cors.php配置支持跨域携带凭证:

return [
    'paths' => ['api/*', 'sanctum/csrf-cookie'],
    'allowed_methods' => ['*'],
    'allowed_origins' => ['https://domain.co.uk'],
    'allowed_origins_patterns' => [],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 0,
    // 必须开启此项,否则跨域请求不会携带Cookie
    'supports_credentials' => true,
];

4. 调整Cookie的SameSite属性

生产环境下,Cookie的SameSite属性若为Strict,会导致子域到主域的跨域请求无法携带Cookie。修改config/session.php:

return [
    // ...其他配置
    'same_site' => 'lax', // 或'none'(仅HTTPS环境可用)
];

若设置为none,必须确保站点使用HTTPS,否则浏览器会拒绝该Cookie。

5. 手动提取Cookie并设置请求头(终极方案)

若Axios自动处理仍失效,可手动从Cookie中提取XSRF-TOKEN并添加到请求头:

// 工具函数:获取指定Cookie的值
function getCookie(name) {
    const value = `; ${document.cookie}`;
    const parts = value.split(`; ${name}=`);
    if (parts.length === 2) return parts.pop().split(';').shift();
}

// 添加请求拦截器,手动设置XSRF头
axios.interceptors.request.use(config => {
    const xsrfToken = getCookie('XSRF-TOKEN');
    if (xsrfToken) {
        config.headers['X-XSRF-TOKEN'] = decodeURIComponent(xsrfToken);
    }
    return config;
});

关键注意点

  • 建议将SESSION_DOMAIN改为.domain.co.uk(带前缀点),确保子域能共享Cookie:
    SESSION_DOMAIN=.domain.co.uk
    SANCTUM_STATEFUL_DOMAINS=domain.co.uk
    
  • 生产环境必须使用HTTPS,否则跨域携带Cookie、SameSite=None等配置都会失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:14:59