使用哪种护照认证

bal*_*azs 2 node.js passport.js

我在我的网站中使用了几种Passport身份验证策略,效果很好,但是,我需要一个Demo或(我们可以调用session)策略,它会根据它的会话ID自动授权用户,现在我手动执行,当用户导航时在/demo页面上,我使用会话ID在db(mongodb)上运行查询,如果用户存在,我使用该用户呈现页面,如果不是,我创建一个.

app.get('/demo', function(req,res) {
  db.User.findOne({ 'accounts.kind': 'demo', 'accounts.sid': req.sessionID }, function(err, user) {
    if (user) {
      res.render( 'home', {
        user: user
      });
    } else {
      var user = new db.User();
      user.accounts.push({
        kind: 'demo',
        sid: req.sessionID,
        created: Date.now
      });
      req.session.userId = user._id;

      user.save(function(err) {
        if(err) { throw err; }
        res.render( 'home', {
          user: user
        });
      });
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

用户架构如下所示:

UserSchema = new Schema({
  uname: {type: String},
  accounts: [],
  docs:[{type:Schema.Types.ObjectId, ref:'Doc'}]
})
Run Code Online (Sandbox Code Playgroud)

它工作,但我需要设置一个会话变量,因为这个方法不会登录用户,我的意思是req.user请求中没有,但是使用该会话变量我可以检查用户是否是演示用户.

if (req.user) {
    userid = req.user._id.toString();
  } else {
    userid = req.session.userId;
  }
Run Code Online (Sandbox Code Playgroud)

我确信有一个更优雅的方式,使用现有的护照策略之一.我看到有护照-http,护照匿名和其他几个,但我不确定我应该使用哪个.

对我来说,为用户创建数据库条目很重要.所以稍后我可以附加另一个帐户.

小智 6

事实证明,在这种情况下,创建自定义策略是不必要的.我发现官方的LocalStrategy有一个(未记录的)passReqToCallback选项,它允许您访问reqverify函数中的对象.只有通过更改验证功能,您才可以使用它来使用LocalStrategy执行各种操作:

passport.use(new LocalStrategy({
    passReqToCallback: true
}, function(req, username, password, done) {
    //now that you have req object, you can
    //probably do whatever you need to do right here
});
Run Code Online (Sandbox Code Playgroud)

请注意,该函数现在需要4个参数req, username, password, done,以reqobject 开头,而不是默认值3.

我希望这可以节省你一些时间,我花了一个小时试图解决这个问题,然后再浏览LocalStrategy代码.