护照本地类型错误

时间:2014-08-02 04:57:38

标签: node.js sails.js passport.js passport-local

我正在尝试在我的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回调有一个错误,这意味着即使身份验证成功,登录也会失败。我迷失了为什么我收到这个错误。

1 个答案:

答案 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从数据存储区中抽出一堆用户,而只有一个用户看起来很傻。

好吧,好吧。