【问题标题】:NodeJS Passport local strategy inform client user is authedNodeJS Passport 本地策略通知客户端用户已通过身份验证
【发布时间】:2014-07-04 09:36:33
【问题描述】:

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

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

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

由于护照已经验证了我的路线并调用了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 中间件内部登录?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-05-25
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 2018-06-08
      • 2022-07-19
      相关资源
      最近更新 更多