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

Express搭配React项目发送CSURF token报错invalid csrf token如何解决

故障原因

csurf 中间件开启 cookie: true 模式时,cookie 中存储的 _csrf 是加密用的盐值,并非直接用于服务端校验的有效 CSRF Token,直接读取该值传递给服务端必然触发校验失败。

解决方案(完全不影响原有EJS服务逻辑)

第一步:服务端新增CSRF Token获取接口

在现有CSRF中间件注册逻辑之后,新增一个专门给React端获取有效Token的接口,原有EJS相关的渲染、校验逻辑完全不用修改:

const csrfMiddleware = csurf({
  cookie: true,
});
app.use(csrfMiddleware);

// 新增:给React前端返回有效CSRF Token的接口
app.get('/api/csrf-token', (req, res) => {
  res.json({
    csrfToken: req.csrfToken()
  });
});

// 原有其他路由、EJS渲染逻辑保持不变

第二步:修改React端请求逻辑

放弃直接读取Cookie中_csrf的逻辑,改为先调用上述接口获取有效Token,所有请求都开启credentials配置确保Cookie正常传递:

// 初始化应用时先请求获取有效CSRF Token
const getCsrfToken = async () => {
  const response = await fetch('/api/csrf-token', {
    credentials: 'include' // 必须开启,确保服务端种下的CSRF Cookie能正常保存和传递
  });
  const data = await response.json();
  return data.csrfToken;
}

// 业务请求时使用拿到的有效Token
const csrfToken = await getCsrfToken();
const config = {
  headers: {
    "CSRF-Token": csrfToken,
    "Content-Type": "application/json",
  },
  credentials: 'include' // 所有业务请求都需要开启该配置
};
跨域场景额外配置

如果React应用和Node服务不在同域名下,需要额外配置服务端CORS规则:

  • Access-Control-Allow-Origin 指定为React应用的域名,不能设为*
  • Access-Control-Allow-Credentials 设为true

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 21:15:04