javascript - 将 csrf token 公开给位于不同域的客户端

标签 javascript express vue.js csrf nuxt.js

我正在使用模块https://www.npmjs.com/package/csurf保护我的公共(public)路由免遭跨站点请求伪造。服务器和客户端托管在两个不同的域中,因此我无法使用直接方式将生成的 token 传递给客户端。

我现在在服务器上创建了两个不同的端点,/csrfToken正在发送生成的 token 和 header 中的csrf cookie,并且路由/register必须验证给定的 token 和csrf cookie是否正确。

const csrfProtection = csrf({
  cookie: {
    maxAge: 900
  }
})

router.get('/csrfToken', csrfProtection, async (req, res, next) => {
  res.json({ token: req.csrfToken() });
});

router.post(
  '/register',
  csrfProtection,
  async (req, res, next) => {
    return res.send('user registered');
  }
);

我现在面临的问题是端点/csrfToken 对所有公共(public)请求开放,每个人都可以向它发出请求。那么有没有一种方法可以在不向客户端公开凭据的情况下获取 token ?

我正在使用 nuxt/vue,如果这与解决我的问题相关。

最佳答案

由于您将 token 公开为 JSON,因此您可能会使用 Ajax 发出这些请求。

只需确保您的 Access-Control-Allow-Origin header 仅允许您的网站从中读取数据。

然后,虽然任何人都可以通过非 Ajax HTTP 客户端向端点发出请求,但它无法使用它来执行 CSRF 攻击,因为他们的 token 与用户 cookie 中的 token 不匹配。

关于javascript - 将 csrf token 公开给位于不同域的客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61008489/

相关文章:

vue.js - 发送带有授权 header 的 axios get 请求

javascript - "sortItem"计算属性中的意外副作用

javascript - 最好导出一个包含函数的对象,或者在 ES6 中导出多个函数(有约定吗?)

javascript - 使用 Javascript 连接到 Neo4j(无需驱动程序)

javascript - 捕获异常 : Error: write after end after upgrading Node version

javascript - ExpressJS 将变量传递给 JavaScript

php - FullCalendar - 显示不同的信息

javascript - 检查应用程序是否从网页安装

javascript - 如何使用 Express 通过 HTTP 发送图像

javascript - 如何用js设置input元素值时触发change事件