首页 > 解决方案 > 内部调用 express 路由时禁用 csrf

问题描述

我有以下简单的代码来启用 csrf 保护

import csrf from 'csurf';

const csrfProtection = csrf({
  cookie: {
    httpOnly: true,
    secure: process.env.NODE_ENV === 'production',
  },
});


app.use(csrfProtection);

这意味着所有应用程序路由都在使用中间件,并且

router.get('/auth/csrf', (req, res) => {
  res.json({ csrfToken: req.csrfToken() });
});

在向该服务器发出请求之前必须先调用它。

现在,我有另一个后端微服务正在对一个端点进行 API 调用,我不想在后端服务调用端点时启用 csrf 检查。但是如果它来自其他地方,想要保留检查。

什么方法适合我的情况?

标签: javascriptnode.jsexpresscsrf

解决方案


如果您的应用程序中确实需要 CSRF,那么您可能不应该禁用它。话虽如此,您可以使用自定义中间件为您的路由选择可选的 CSRF:

import csrf from 'csurf';

const csrfProtection = csrf({
  cookie: {
    httpOnly: true,
    secure: process.env.NODE_ENV === 'production',
  },
});

function optionalCSRF(req, res, next) {
  if (req.query.disableCSRF === 'true') {
    return next();
  }

  csrfProtection(req, res, next);
}

app.use(optionalCSRF);

推荐阅读