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

如何在无表单的POST响应中添加Lusca CSRF Token?基于Hackathon Starter模板

解决Lusca CSRF Token缺失问题(无需白名单/表单)

嘿,我来帮你搞定这个CSRF Token报错的问题!你不想用URL白名单/黑名单或者表单提交的方式,其实Lusca本身就支持更灵活的Token传递方式,下面给你两种实用方案:

方法1:通过请求头携带CSRF Token

Lusca默认会自动生成CSRF Token,并且把它存在req.csrfToken()方法里,同时还会设置一个名为XSRF-TOKEN的Cookie到浏览器。你只需要让前端从Cookie中取出这个Token,然后在POST请求的请求头里添加X-XSRF-TOKEN字段,Lusca就会自动校验这个Token的有效性。

你的后端路由代码不用做任何修改,保持原样即可:

exports.postTest = (req, res) => {
  // 这里写你的业务逻辑
  res.json({ success: true, message: "POST请求处理成功" });
};

前端可以这样获取并携带Token(以fetch API为例):

// 封装一个获取Cookie的小工具
const getCookie = (name) => {
  const value = `; ${document.cookie}`;
  const parts = value.split(`; ${name}=`);
  if (parts.length === 2) return parts.pop().split(';').shift();
};

// 从Cookie中取出Lusca设置的XSRF-TOKEN
const csrfToken = getCookie('XSRF-TOKEN');

// 发送POST请求时在请求头带上Token
fetch('/test', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-XSRF-TOKEN': csrfToken
  },
  body: JSON.stringify({ yourData: 'test content' })
})
.then(response => response.json())
.then(result => console.log(result))
.catch(error => console.error('请求出错:', error));

方法2:服务端注入Token到页面(适用于服务端渲染场景)

如果你的项目是服务端渲染(比如用EJS模板),可以在中间件里把CSRF Token注入到res.locals中,然后在页面的JS里直接使用这个Token,不用借助表单的隐藏字段。

首先在app.js里添加一个中间件(要放在Lusca配置之后):

app.use((req, res, next) => {
  // 把生成的CSRF Token注入到响应 locals 中
  res.locals.csrfToken = req.csrfToken();
  next();
});

然后在你的模板文件(比如views/test.ejs)里,把Token存到JS变量中:

<script>
  // 直接从服务端渲染的变量中拿到CSRF Token
  const csrfToken = '<%= csrfToken %>';
</script>

之后发送POST请求时,同样可以选择在请求头携带X-XSRF-TOKEN,或者如果想把Token放在请求体里,只需要在Lusca的配置里指定校验的字段名(比如_csrf):

// 在app.js的Lusca配置中修改
app.use(lusca.csrf({ key: '_csrf' }));

这样请求体里带上_csrf: csrfToken,Lusca也能正常校验。

重要提醒

别像你之前尝试的那样手动设置res.local = {_crf:"_crf"},这种硬编码的Token是无效的——Lusca的CSRF Token是和用户会话绑定的,必须通过req.csrfToken()方法生成才有效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:56:38