NodeJS Passport本地策略通知客户端用户已经过authed

时间:2014-05-15 19:07:26

标签: node.js session-cookies passport.js passport-local

我已经使用本地护照和MongoDB实现了Passport,它运行良好。

然而,这是一个纯粹的客户端单加载应用程序,因此节点不负责呈现html。因此,目前我在应用程序加载时显示加载微调器,并单独调用api以确定用户是否已登录以有条件地呈现某些内容:

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

由于护照已经验证了我的路线并且呼叫deserializeUser这看起来毫无意义 - 我需要一种方法来传递一条额外的信息(在cookie中?),说明用户已经过操作,我猜是在{{ 1}}?

deserializeUser

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

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 因此我认为我可以与客户端通信用户在那里进行通信,或者在deserializeUser中间件内登录?

1 个答案:

答案 0 :(得分:0)

事实证明,我可以在passport.session之后添加一个中间件。我担心req.isAuthenticated会触发对数据库的另一个查询,但它没有:

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