NodeJS 使用csrf-csrf时出现`无效的csrf标记'错误

v8wbuo2f  于 2023-01-25  发布在  Node.js
关注(0)|答案(1)|浏览(165)

我在使用csrf-csrf替换csurf时遇到了一个问题。令牌已成功生成。但当我提交表单时,它显示错误invalid csrf token
我的代码:
在应用程序js中

app.use((req, res, next) => {
  res.locals.isAuthenticated = req.session.isLoggedIn;
  res.locals.csrfToken = generateToken(res);
  console.log(res.locals.csrfToken);
  next();
});

鉴于:

<form class="login-form" action="/signup" method="POST">
   ...
   <input type="hidden" name="_csrf" value="<%= csrfToken %>" >
   <button class="btn" type="submit">Signup</button>
</form>

当我单击"注册"时,显示错误。

ForbiddenError: invalid csrf token
    at doubleCsrf (/workspace/nodejs-practice/node_modules/csrf-csrf/lib/cjs/index.cjs:18:61)
    at Object.<anonymous> (/workspace/nodejs-practice/app.js:24:5)
    at Module._compile (node:internal/modules/cjs/loader:1165:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1219:10)
    at Module.load (node:internal/modules/cjs/loader:1043:32)
    at Function.Module._load (node:internal/modules/cjs/loader:878:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:22:47

有什么想法吗?谢谢你们!
更新:
我检查了csrf-csrf的源代码。我发现它通过以下方式从请求中获取令牌

getTokenFromRequest = (req) => req.headers["x-csrf-token"]

在我的例子中,它将是未定义的。那么我如何将令牌添加到请求头中呢?

gorkyyrv

gorkyyrv1#

我通过在doubleCsrf()中重写getTokenFromRequest来解决这个问题。

const {
  generateToken, // Use this in your routes to provide a CSRF hash cookie and token.
  doubleCsrfProtection, // This is the default CSRF protection middleware.
} = doubleCsrf({
  getSecret: () => "my secret",
  getTokenFromRequest: (req) => {
    return req.body._csrf;
  },
});

我不得不说,要成为一名优秀的开发人员,我还有很长的路要走。
希望这对其他人有帮助。

    • 不要害怕阅读源代码,也许你会发现它并不像你想象的那么神秘和难懂**

相关问题