我正在使用模块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/