一尘不染

在PassportJS中使用多种本地策略

node.js

我正在尝试对PassportJS使用多种本地策略。我不尝试使用本地,facebook和gmail等。我将两组用户存储在单独的对象中,并且我想使用本地策略对两者进行身份验证。就目前而言,我不能对两者使用相同的本地策略,因为它们具有不同的对象属性,这使我查询不同的对象。有什么办法吗?或对此的任何建议将不胜感激。


阅读 259

收藏
2020-07-07

共1个答案

一尘不染

我认为这是不可能的,因为据我所知,您需要一种在第一个策略失败时将请求“移交给”第二个策略的方法,而且我认为这是不可能的。

但是您可能可以使用一种本地策略,并且仅尝试使用这两种方法对传入的数据进行身份验证。

作为一个简单的示例(使用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'));
    });
  }); 
}));

对于序列化/反序列化,您可能需要在user传递给的对象中存储一些属性,done以表示反序列化用户所需的模型。

2020-07-07