javascript - Passport 登录可以,但密码错误只是超时

标签 javascript authentication passport.js bcrypt

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

我的意思是,如果我输入错误的密码,我可以console.log err它显示了正确的错误,但 if (err) {} 内没有任何内容已达到,如果我输入不在数据库中的电子邮件,也会发生同样的事情, Passport 返回 undefined对于 userif (!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);
    }

  }

});

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

最佳答案

答案当然很简单...我在路线开始时声明了 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);
  });

感谢您的帮助!

关于javascript - Passport 登录可以,但密码错误只是超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35708281/

相关文章:

javascript - 将智能表添加到meanjs堆栈

javascript - 有没有办法阻止脚本加载两次? JavaScript

ios - Firebase + auth0 身份验证

node.js - passport.js ,在弹出窗口中验证后,关闭它并重定向父窗口

javascript - Ajax发送并添加隐藏字符

javascript - JS 使用不同的填充

ios - Box API 身份验证 - Objective-c iOS

c# - 通过复选框以编程方式为 MVC 4 中的用户分配角色

node.js - 在单元测试中模拟 Passport.js(本地策略)

javascript - 基于 Angular.js + Node.js/PassportJS 的 SPA 上的 oauth2 身份验证