【问题标题】:Passport Authentication: chaining strategies护照认证:链式策略
【发布时间】:2016-01-07 13:42:35
【问题描述】:

我如何顺序运行两个或多个passport 策略,这意味着如果一个策略空了然后运行另一个策略?

我试过这样做:

app.post('/', function (req,res,next){ 
  passport.authenticate('strategy1', function (err, result1) {
    if (err) { return next(err); }
    if (!result1) { 
        passport.authenticate('strategy2', function (err,result2){
           if (err) { return next(err); }
           if(!result2){
             return res.redirect('/');}
           req.login(result2, function (err){
               if(err){return next(err)}
                 res.render('result2');
             })
           });
    }
    req.login(result1, function (err){
        if (err){return next(err)}
          console.log('admin login found');
          res.render('result');
    });
})(req, res, next);
});

但是我得到这个错误:

Error: Failed to serialize user into session

我已经实现了:

passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(user, done) {
 done(null, user);
});

我怀疑user 在第一个passport.authentication 调用中被序列化,然后它试图用第二个调用再次序列化它,我需要做的是在运行第二个策略之前再次反序列化它。

感谢您的帮助!

【问题讨论】:

  • 可以用done(null, JSON.stringify(user))替换序列化函数,用done(null, JSON.parse(user))替换解串函数吗?

标签: node.js passport.js


【解决方案1】:

我最终只坚持一种策略,但添加了逻辑以允许它检查多个collections,正如answer 中所建议的那样。

passport.use('local', new LocalStrategy({
passReqToCallback : true
}, function(req, username, password, done) {
    process.nextTick(function() {
        collection1.findOne({'username': username}, function(err, collectionresult) {
            if (err) {
                return done(err);
            }          
            if (!collectionresult) {
                collection2.findOne({'username': username}, function(err, collection2result){
                     if (err) {
                        return done(err);
                    }          
                    if (!collection2result) {
                        return done(null, false,req.flash('adminmessage','Invalid username or password'));
                    }
                    if (!collection2.validPassword(password))  {
                        return done(null, false,req.flash('adminmessage','Invalid username or password'));
                    }
                    console.log('local strategy has authenticated employee username and password! Returning employee');
                    return done(null, employee);
                })
            }
            if (collection2result){
                if (collection2result.password!=password) {
                return done(null, false, req.flash('adminmessage','Invalid username or password' ));
                }
                else{
                    console.log('Local strategy has found an admin. Returning admin');
                    return done(null, collection2result)
                }
            }
        });
    }
);
}));

【讨论】:

    猜你喜欢
    • 2016-10-12
    • 2015-11-12
    • 2015-09-10
    • 2012-06-09
    • 2015-03-20
    • 2021-02-11
    • 2021-09-02
    • 1970-01-01
    • 2016-05-29
    相关资源
    最近更新 更多