Passport 登录有效,但密码不正确只是超时

Passport login works, but incorrect password just times out

我正在我的网站上制作一个授权部分。我正在使用 bcrypt-nodejs、passport 和 passport-http 进行身份验证,并使用 Sql Server 和 Sequelize 作为我的数据库。我已经创建了一个登录路径,如果我输入了正确的密码和电子邮件,那么登录就会成功并且 returns 是正确的用户对象,但是如果输入了错误的 username/password 或者有错误,那么它会计时出去。

我的意思是,如果我输入了一个错误的密码,我可以 console.log err 并显示正确的错误,但是 if (err) {} 里面什么都没有,并且如果我输入不在数据库中的电子邮件,user 的护照 returns undefinedif (!user) {} 中的任何内容都无法访问,也会发生同样的事情。但是,如果我输入正确的用户名和密码,它就会到达 if (user) {} 并调用 res.json({msg: 'authenticated as ', userEmail}); 并且 userEmail 的信息是正确的。

这是我的路线:

app.get('/login', function(req, res, next) {
  passport.authenticate('basic', function(err, user, info) {
    console.log(clc.blueBright('err ::::::  '), err);
    var userEmail = user.dataValues.password;
    if (err) {
      res.json({
        msg: 'internal server error'
      });
    }
    if (!user) {
      console.log(clc.redBright('!user ::::::  '));
      res.json({
        msg: 'invalid username or password'
      });
    }
    if (user) {
      res.json({
        msg: 'authenticated as ',
        userEmail
      });

    }
  })(req, res, next);
});

我的 passport_strat 看起来像这样:

'use strict';

var Basic = require('passport-http').BasicStrategy;
var User = require('../models/User');
var clc = require('cli-color');

module.exports = function(passport) {
  passport.use('basic', new Basic({}, function(email, password, done) {
    User.findOne({
        where: {
          email: email
        }
      })
      .then(function(user) {
        // console.log(clc.greenBright('Done Callback ::::   '), done);
        if (!user) {
          return done('no such user');
        }
        if (!user.$modelOptions.instanceMethods.verifyPassword(password, user.dataValues.password)) {
          return done('wrong password');
        }
        if (user.$modelOptions.instanceMethods.verifyPassword(password, user.dataValues.password)) {
          // console.log(clc.blueBright('password matched'));
          return done(null, user);
        }
      })
      .error(function(err) {
        console.log(err);
        res.status(500).json({
          msg: 'there was a problem logging in to your account'
        });
      })
  }));
}

我的用户模型如下所示:

var User = module.exports = sql.define('User', {
  userName: Sql.STRING,
  password: Sql.STRING,
  email: Sql.STRING,
}, {
  instanceMethods: {
    verifyPassword: function(password, userPassword) {
      return bcrypt.compareSync(password, userPassword);
    },
    generateToken: function(secret, callback) {
      return eat.encode({
        id: this.id
      }, secret, callback);
    },
    generateHash: function(password) {
      return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
    }

  }

});

昨天我为此工作了几个小时,我被难住了。如果您需要更多信息,请告诉我。任何帮助将不胜感激。预先感谢您的所有帮助!

尝试返回您的 res.json

return res.json

如果出现错误,您的 if 语句将尝试发送响应,然后它会下降到 !user 如果出现错误,我确定也是如此,因此它正在尝试发送multiple headers 这可能是你搞砸的原因。

嗯,答案当然很简单...我在路由的开头声明了 var userEmail = user.dataValues.password;,所以当没有用户对象时,函数此时崩溃了,但它是在console.log 所以它记录了 err。 @Datsick 也给我指出了正确的方向,当我也意识到在修复 console.log 问题后,无论失败的原因是什么,我都会收到同样的错误。

最后,工作授权看起来像这样:

passport_strat.js:

'use strict';

var Basic = require('passport-http').BasicStrategy;
var User = require('../models/User');
var clc = require('cli-color');

module.exports = function(passport) {
  passport.use('basic', new Basic({}, function(email, password, done) {
    User.findOne({
        where: {
          email: email
        }
      })
      .then(function(user) {
        if (user) {
          var verified = user.$modelOptions.instanceMethods.verifyPassword(password, user.dataValues.password);
        }
        if (!user) {
          done('no such user');
        }
        if (user && !verified) {
          done('wrong password');
        }
        if (user && verified) {
          done(null, user);
        }
      })
      .error(function(err) {
        console.log(err);
        res.status(500).json({
          msg: 'there was a problem logging in to your account'
        });
        done(err);
      })
  }));
}

我的路线看起来像这样(模型没有改变):

  app.get('/login', function(req, res, next) {
    passport.authenticate('basic', {
      session: false
    }, function(err, user, info) {
      if (err && user) {
        console.log(clc.redBright('Login error: '), err);
        res.json({
          msg: 'internal server error'
        });
      }
      // if user is not found due to wrong username or password
      if (err && !user) {
        console.log(clc.redBright('Login error: '), err);
        res.json({
          msg: 'invalid username or password'
        });
      }
      if (user && !err) {
        var userEmail = user.dataValues.email;
        res.json({
          msg: 'authenticated as ',
          userEmail
        });

      }
    })(req, res, next);
  });

感谢大家的帮助!