护照中间件不运行

Posted

技术标签:

【中文标题】护照中间件不运行【英文标题】:passport middleware does not run 【发布时间】:2021-06-03 20:01:40 【问题描述】:

我正在使用 passportJS 进行身份验证。我在 app.js 中调用了 setAuthenticatedUser 函数

app.use(passport.initialize());
app.use(passport.session());
app.use('/', require('./routes'));
app.use(passport.setAuthenticatedUser);

这是我在文件 ./config/passport-local.js 中的中间件

passport.setAuthenticatedUser = async function (req, res, next) 
    if (await req.isAuthenticated()) 
        // req.user contains the current signed in user from the session cookie and we are just sending this to the locals for the views
        res.locals.user = req.user;
        // console.log('Locals\' user loaded');
    
    next();

在app.js中调用后没有错误但setAuthenticatedUser没有运行。相反,我必须从每个路由手动调用中间件

router.get('/', passport.setAuthenticatedUser, homeController.home);
router.get('/route1', passport.setAuthenticatedUser,homeController.route1);
router.get('/route2', passport.setAuthenticatedUser, homeController.route2);
router.get('/route3', passport.setAuthenticatedUser, homeController.route3);
router.get('/route4', passport.setAuthenticatedUser, homeController.route4);

我以后会添加更多的路线。我该怎么做才能不必为每个 get req 添加中间件?

如果您需要更多信息,请告诉我

【问题讨论】:

【参考方案1】:

尝试将最后两次调用的顺序颠倒到app.use。 Express 将按照定义的顺序调用这些函数。

我假设您在./routes 中定义的路由不调用next(),因此下一组中间件(在本例中为passport.setAuthenticatedUser)无法运行。因此,请确保对 Passport 函数的调用发生在您的路由处理程序之前,或者更一般地说,在任何不会调用 next() 的函数之前。

【讨论】:

以上是关于护照中间件不运行的主要内容,如果未能解决你的问题,请参考以下文章

javascript 护照 - 中间件持票人

护照身份验证不起作用。从未调用过的 Passport.serializeUser 和 passport.deserializeUser 会被调用

护照和智威汤逊

Laravel 护照公共 api 路线

Laravel 护照刷新令牌

passport.initialize() 中间件未使用