将CSRF令牌公开给其他域上的客户端

时间:2020-04-03 09:08:28

标签: javascript express vue.js csrf nuxt.js

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

我现在在服务器上创建了两个不同的终结点,/ csrfToken在头中发送生成的令牌和csrf cookie,并且路由/ register如果正确,必须验证给定的令牌和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对所有公共请求都是开放的,每个人都可以向它发出请求。那么有没有办法我可以在不将凭据暴露给客户端的情况下获取令牌?

如果要解决我的问题,我正在使用nuxt / vue。

1 个答案:

答案 0 :(得分:1)

由于将令牌公开为JSON,因此大概是使用Ajax发出这些请求。

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

然后,尽管任何人都可以通过非Ajax HTTP客户端向端点发出请求,但由于他们的令牌与用户Cookie中的令牌不匹配,因此它将无法使用该请求执行CSRF攻击。