Passport身份验证:链接策略

时间:2016-01-06 13:04:15

标签: node.js passport.js

如何顺序运行两个或更多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调用中被序列化了,然后它尝试再次使用第二个序列化它,我需要做的是在运行第二个策略之前再次对它进行反序列化

感谢帮助!

1 个答案:

答案 0 :(得分:0)

我最终只坚持一个策略,但添加了逻辑,允许它按照answer中的建议检查多个collections

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)
                }
            }
        });
    }
);
}));