【问题标题】:Passport not redirecting after authorization授权后护照不重定向
【发布时间】:2014-06-12 10:55:25
【问题描述】:

我遇到了一个问题,当我尝试使用护照登录时,页面没有重定向。授权返回true(用户名、密码正确)。

我很确定它在我的 validPassword 函数中的某个地方,但我不确定。

登录路径

app.get('/login', function (req, res) {
  res.render('login', {});
});

登录帖子

app.post('/login',
  passport.authenticate('local', { successRedirect: '/',
                                   failureRedirect: '/login' }));

用户原型

User.prototype.validPassword = function(username, unhashedPassword) {
  async.waterfall([
    function (callback) {
      User.find({ "username" : username }, function (err, data) {
        if(err) return handleError(err);
        callback(null, data);
      });
    },
    function (data, callback) {
      var isGood = passwordHash.verify(unhashedPassword, data[0].password);
      callback(null, isGood);
    }
  ], function (err, result) {
    return result;
  });
};

本地策略

passport.use(new LocalStrategy(
  function(username, password, done) {
    var unhashedPassword = password;
    var passedUsername = username;
    User.findOne({ username: username }, function(err, user) {
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(passedUsername, unhashedPassword)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));

没有错误打印到我的控制台,所以我现在有点困惑。 isGood 是否以错误的格式返回?任何帮助都会很棒。

【问题讨论】:

  • 它是否重定向到正确的子域? (127.0.0.1 或本地主机)?
  • @PSeUdocode 如果我在 127.0.0.1 上,它会重定向到 127.0.0.1,本地主机也是如此。发生的情况是,您输入您的信息并点击登录,网址栏从/login/ 再到/login,所有这些都在同一序列内,这意味着授权不正确。它给了我一个 302 错误,但我的 app.post('/login') 路由显然在那里。

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


【解决方案1】:

我发现了我的问题。问题在于我的本地策略和我的validPassword 原型。

在我的策略中,我有一个console.log错误,用户名无效错误,密码无效。我的prototype 中还有一个console.log 打印passwordHash.verify(unhashedPassword, this.password) 的评估。

当我发布登录时,控制台会打印如下:

LOG: valid username (Strategy)
LOG: invalid password (Strategy)
LOG: true (Prototype)

按照逻辑流程,LOG: true (prototype) 应该出现在 LOG: invalid password (Strategy) 之前,但它出现在之后意味着某处同步出现问题。

好吧,我通过删除大约 15 行代码解决了这个问题,现在它就像一个美女一样工作。

这就是我现在的身份验证策略的样子。

User.prototype.validPassword

User.prototype.validPassword = function(unhashedPassword) {
  return passwordHash.verify(unhashedPassword, this.password);
};

本地策略

passport.use(new LocalStrategy({
    usernameField: 'username',
    passwordField: 'password'
  },
  function(username, password, done) {
    var unhashedPassword = password;
    var passedUsername = username;
    process.nextTick(function () {
      User.findOne({ username: passedUsername }, function(err, user) {
        console.log('within local strategy', user);
        if (err) { 
          console.log('Error:', err);
          return done(err); 
        }
        if (!user) {
          console.log('Incorrect username:');
          return done(null, false, { message: 'Incorrect username.' });
        }
        if (!user.validPassword(unhashedPassword)) {
          return done(null, false, { message: 'Incorrect password.' });
        }
        return done(null, user);
      });
    });
  }
));

POST 登录

app.post('/login',
  passport.authenticate('local', { failureRedirect: '/login' }),
  function(req, res) {
    res.redirect('/');
  });

【讨论】:

    猜你喜欢
    • 2014-03-31
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2018-03-18
    • 2017-12-22
    • 2023-03-14
    相关资源
    最近更新 更多