我设法使csurf
应用程序作为常规中间件在其中运行。但是,我想将其添加到我的自定义身份验证中间件中,既避免在每个路由中都包含express
,又避免忘记使用它。如何在自定义中间件中调用csurf
?
例如,说我有使用csurf
的中间件来限制对登录用户的访问:
express-session
export const auth = async (req, res, next) => {
const { uid } = req.session;
try {
const user = await User.query().findById(uid);
req.session.role = user.role;
next();
} catch {
throw new PrivateRouteError();
}
};
可以做到这一点,但我无法实现它。这是我尝试过的:
This answer
但是,结果是export const auth = async (req, res, next) => {
const csrf = csurf({ cookie: true, ignoreMethods: [] });
csrf(req, res, async () => {
const { uid } = req.session;
try {
const user = await User.query().findById(uid);
req.session.role = user.role;
next();
} catch {
throw new PrivateRouteError();
}
});
};
不会阻止对丢失的CSRF令牌的访问,并且csurf
不会被捕获并使应用程序崩溃(如果用户未通过身份验证,则可以正常工作。)>]
是否有一种巧妙的方法将PrivateRouteError
捆绑到我的中间件中,还是应该手动将其添加到所有使用csurf
中间件的路由中?
我设法使csurf作为常规中间件在我的express应用中工作。但是,我想将其添加到我的自定义身份验证中间件中,以避免都在每条路由中都包含csurf ...
[好吧,我昨晚显然在考虑这个问题。摆脱auth
调用并将next()
内容放入catch块就足够了。