1

我正在尝试在我的 Sails 项目中使用本地护照进行身份验证。在我的控制器中:

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: Cannot read property 'id' of undefined]

我是新来的护照,我不完全确定它在哪里失败,因为它似乎实际上是在找到用户,并在配置文件中成功地比较了密码(一些控制台日志似乎表明了这一点)。但是 req.login 回调有一个错误,这意味着即使身份验证成功,登录也会失败。我不知道为什么会收到此错误。

4

1 回答 1

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 从数据存储中提取一堆用户,而应该只有一个 id 对我来说似乎很愚蠢。

那好吧。

于 2014-08-06T03:42:06.130 回答