NodeJS护照本地策略通知客户端用户已被授权



我已经实现了Passport与Passport -local和MongoDB,它工作得很好。

然而,这是一个纯客户端单加载应用程序,所以node不负责渲染html。所以目前我在app load上显示一个正在加载的旋转器并单独调用api来确定用户是否登录并有条件地渲染一些东西:

router.get('/me', function (req, res) {
    res.send(req.isAuthenticated() ? {} || 401);
});

由于passport已经验证了我的路由和呼叫deserializeUser,这似乎毫无意义-我需要一种方法来传递额外的信息(在cookie中?),说明用户已被授权,我猜在deserializeUser ?

server.use(session({secret: settings.sessionSecret}));
server.use(passport.initialize());
server.use(passport.session());
....
passport.use(new LocalStrategy(
        localOpts,
        function(email, password, done) {
            User.findOne({
                email: email,
                activated: true
            }, function (err, user) {
                ....
        });
    }
));
passport.serializeUser(function (user, done) {
    done(null, user._id);
});
passport.deserializeUser(function (id, done) {
    User.findById(id, function(err, user) {
        done(err, user);
    });
});

请注意,登录成功时创建的两个cookie:

express:sess
express:sess.sig

当它检测到这些cookie的存在时,它似乎只是调用deserializeUser,因此为什么我认为我可以与客户端通信,用户在那里被授权,或者在passport.use中间件内部登录?

事实证明,我可以简单地在passport.session之后添加一个中间件。我担心req.isAuthenticated会向db发起另一个查询,但它没有:

server.use(function(req, res, next) {
    res.cookie('isAuthenticated', req.isAuthenticated());
    next();
});

最新更新