node.js - “消息”:“无效的 csrf 令牌”,“代码”:“EBADCSRFTOKEN”
问题描述
我在 stackoverflow 中阅读了所有类似的问题,我在csurf
github 页面中检查了问题,但我无法找出问题所在。这是快速中间件文件:
const app = express();
const csrfProtection = csrf();
const MongoDBSessionStore = MongoDBStore(session);
const store = new MongoDBSessionStore({
uri: process.env.MONGODB_URI!,
collection: "sessions",
});
app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "views"));
app.use(favicon(path.join(__dirname, "public", "favicon.ico")));
app.use(cors());
app.use(express.json());
app.use(multer({ storage: fileStorage, fileFilter }).single("image")); //arrray for multiple
app.use(express.static(path.join(__dirname, "public")));
app.use("/images", express.static(path.join(__dirname, "images")));
app.use(helmet());
app.use(compression());
app.use(
session({
name: "ts-authentication-app",
secret: process.env.SESSION_SECRET!,
resave: false,
saveUninitialized: false,
store: store,
})
);
app.use(csrfProtection);
app.use(flash());
app.use(isAuthroized);
app.use((req, res, next) => {
res.locals.isAuthenticated = req?.session?.isLoggedIn;
res.locals.csrfToken = req.csrfToken();
console.log("token", req.csrfToken());
next();
});
app.use("/admin", adminRoutes);
app.use(shopRoutes);
app.use(authRoutes);
app.get("/500", errorController.get500);
app.use(errorController.get404);
app.use(morgan("combined", { stream: morganLogStream }));
app.use(errorHandler);
我正在使用 ejs 模板引擎。这是登录模板。
<form class="login-form" action="/login" method="POST" >
<div class="form-control">
<label for="email">E-Mail</label>
<input
class="<%= validationErrors.find(e => e.param === 'email') ? 'invalid' : '' %>"
type="email"
name="email"
id="email"
value="<%= oldInput.email %>">
</div>
<div class="form-control">
<label for="password">Password</label>
<input
class="<%= validationErrors.find(e => e.param === 'password') ? 'invalid' : '' %>"
type="password"
name="password"
id="password"
value="<%= oldInput.password %>">
</div>
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
<button class="btn" type="submit">Login</button>
</form>
csrfToken
以模板形式呈现。当我将“隐藏”更改为“文本”类型时,我会在页面上看到令牌。我注释掉了每个中间件以查看是否有任何中间件导致了问题,但我仍然收到错误消息。
我记录了 req 对象
csrfToken: [Function: csrfToken],
并附加到 request 对象。
我仍然无法弄清楚这个问题。
解决方案
您似乎没有为您用于表单的编码类型设置适当的正文解析器 - 即默认的x-www-form-urlencoded
.
Express 提供了这样一个正文解析器,只需将其添加到您的中间件堆栈中,如下所示:
app.use(express.urlencoded({ extended: false }))
推荐阅读
- acumatica - 如何根据任何条件在报表参数中填充列表
- android - Android 错误“E/ConfigurationContentLoader:PhenotypeFlag 无法加载 ContentProvider”
- python - Python/PyHive - 从异常中提取特定的错误消息
- sql - 如何仅在另一个列值第一次更改时更新列值由两个不同的列分组?
- html - WordPress 网站文本在较小的屏幕宽度上与侧边栏重叠
- apollo - WatchQuery 不会从订阅中更新
- html - 带有三个输入的搜索栏,不起作用?
- syntax - 是否有一种 Kotlin 式的方式来为类分配有趣的参数?
- c++ - pthread_kill() 与 pthread_cancel() 终止因 I/O 阻塞的线程
- java - android.view.InflateException:二进制 XML 文件第 10 行