Passport登录有效,但密码错误只是超时

时间:2016-02-29 19:46:44

标签: javascript authentication passport.js bcrypt

我正在我的网站上制作一个身份验证部分。我使用bcrypt-nodejs,passport和passport-http进行身份验证,使用Sql Server和Sequelize进行数据库访问。我已经建立了登录路线,如果我输入正确的密码和电子邮件,则登录成功并返回正确的用户对象,但如果输入了错误的用户名/密码或出现错误,则超时。

我的意思是如果我输入了一个错误的密码,我可以在console.log err中显示正确的错误,但是if (err) {}内部没有任何内容,同样的事情发生了如果我输入的数据库不在数据库中,则护照将undefined返回user,但if (!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);
    }

  }

});

我昨天工作了好几个小时,我很难过。如果您需要更多信息,请与我们联系。任何帮助将不胜感激。在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

答案当然很简单......我在路线的开头宣布E,所以当没有用户对象时,此功能在此时崩溃,但它在控制台之后。记录所以它记录了&*E。 @Datsick还指出了我正确的方向,当我也意识到修复console.log问题后,无论失败的原因是什么,我都收到了同样的错误。

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

passport_strat.js:

var userEmail = user.dataValues.password;

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

err

感谢您的帮助!

答案 1 :(得分:0)

尝试返回res.json

return res.json

如果出现错误,您的if语句会尝试发送回复,然后它会降至!user,如果出现错误,我确定也是如此,所以它是'试图发送多个标题,这可能是搞砸了你。