护照本地types错误

我正在尝试在我的Sails项目中使用passport-local进行身份validation。 在我的控制器中:

passport.authenticate('local', function(err, user, info) { if ((err) || (!user)) { res.json({message: 'Unable to authenticate'}); return; } req.login(user, function(err) { if (err) { res.json({message: 'Unable to login'}); console.log(err); return; } res.json({message: 'logging in'}); }); })(req, res); 

在configuration文件中:

 passport.use(new LocalStrategy(function(username, password, done) { User.findOneByUsername(username).done(function(err, user) { if (err) { return done(null, err); } if (!user) { return done(null, false, { message: 'Incorrect User' }); } bcrypt.compare(password, user.password, function(err, res) { if (err) { return done(null, err); } if (!res) { return done(null, false, { message: 'Invalid Password'}); } return done(null, user); }); }); })); 

答复是“无法login”。 控制台输出是:[TypeError:不能读取未定义的属性'id'

我是新来护照,我不完全知道它失败的地方,因为它似乎实际上是find用户,并在configuration文件中成功比较密码(一些控制台日志似乎表示尽可能多)。 但req.logincallback有一个错误,这意味着即使authentication成功,login失败。 我失去了为什么我得到这个错误。

事实certificate,我试图智取教程。 教程是这样的:

http://jethrokuan.github.io/2013/12/19/Using-Passport-With-Sails-JS.html

它build议使用这个护照设置:

 passport.serializeUser(function(user, done) { done(null, user[0].id); }); passport.deserializeUser(function(id, done) { User.findById(id, function (err, user) { done(err, user); }); }); passport.use(new LocalStrategy( function(username, password, done) { User.findByUsername(username).done(function(err, user) { if (err) { return done(null, err); } if (!user || user.length < 1) { return done(null, false, { message: 'Incorrect User'}); } bcrypt.compare(password, user[0].password, function(err, res) { if (!res) return done(null, false, { message: 'Invalid Password'}); return done(null, user); }); }); }) ); 

但正如你从上面的代码可以看到的,我改变了这个,findOneByUsername,认为这个教程有一些错误。 原来它没有。 错误消息所引用的'id'是我刚刚发布的代码的第二行,其中user [0]在用户是对象时未定义,与对象数组相反。

然而,在评论中,提交人声称他犯了一些错误,包括authenticationlogin可能的冗余,这在护照文档中是矛盾的。 在一个地方,文档推荐它,在另一个地方,他们说这是完全没有必要的。 为什么我们想用一个id从数据存储区中抽出一大堆用户呢?

好吧。