我认为这是不可能的,因为据我所知,当第一个策略失败时,你需要某种方法将请求"传递"给第二个策略,我认为这是不可能的.
但您可能可以使用一种本地策略,并try 使用这两种方法对传入数据进行身份验证.
作为一个简单的示例(使用Mongoose作为示例数据库):
passport.use(new LocalStrategy(function(username, password, done) {
Model1.findOne({ username : username }, function(err, user) {
// first method succeeded?
if (!err && user && passwordMatches(...)) {
return done(null, user);
}
// no, try second method:
Model2.findOne({ name : username }, function(err, user) {
// second method succeeded?
if (! err && user && passwordMatches(...)) {
return done(null, user);
}
// fail!
done(new Error('invalid user or password'));
});
});
}));
对于序列化/反序列化,您可能需要在传递给done
的user
对象中存储一些属性,以指示反序列化用户所需的模型.