6

パスポートを使用してログインしようとすると、ページがリダイレクトされないという問題が発生しています。認証が返され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おそらく間違った形式で返されていますか?どんな助けでも素晴らしいでしょう。

4

1 に答える 1

7

私は自分の問題を理解しました。問題は、私のローカル戦略とvalidPasswordプロトタイプにありました。

私の戦略の中で、エラー、無効なユーザー名またはエラー、無効なパスワードという言葉ありconsole.logました。私の印刷物にも の評価がありました。console.logprototypepasswordHash.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);
};

Local頭脳系

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-04-27T15:56:56.557 に答える