我正在尝试在我的Sails项目中使用passport-local进行身份验证。在我的控制器中:
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);
在配置文件中:
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);
});
});
}));
回复是“无法登录”。 控制台输出是:[TypeError:无法读取未定义的属性'id']
我是护照的新手,我不完全确定它失败的地方,因为它似乎实际上是找到用户,并在配置文件中成功比较密码(某些控制台日志似乎表明了这一点) 。但是req.login回调有一个错误,这意味着即使身份验证成功,登录也会失败。我迷失了为什么我收到这个错误。
答案 0 :(得分:1)
原来我试图超越教程。教程就是这个:
http://jethrokuan.github.io/2013/12/19/Using-Passport-With-Sails-JS.html
建议使用此护照设置:
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是在用户是对象时未定义的,与对象数组相对。
然而,在评论中,作者声称他犯了一些错误,包括验证然后登录可能的冗余,这在护照文档中是矛盾的。在一个地方,文档推荐它,在另一个地方,他们说这是完全没必要的。为什么我们想要使用一个id从数据存储区中抽出一堆用户,而只有一个用户看起来很傻。
好吧,好吧。