Node.js和护照对象没有方法有效密码



我正在使用Node.js + Express + Passport来创建一个简单的身份验证(本地)

以及到目前为止我所达到的,当输入错误的用户名或密码时,用户会被重定向到错误页面

但是当用户输入正确的用户名和密码时,我会收到此错误

node_modulesmongooselibutils.js:435
    throw err;
          ^
TypeError: Object { _id: 50b347decfd61ab9e9e6768f,
username: 'saleh',
password: '123456' } has no method 'validPassword'

我不确定那里有什么问题

app.js(我删除了不必要的代码):

  var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;
  app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

var mongoose = require('mongoose');
var db = mongoose.createConnection('localhost', 'authTest');
var authSchema = mongoose.Schema({ 
  username: 'string',
  password: 'string'
});
var User = db.model('users', authSchema);

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

passport.serializeUser(function(user, done) {
  done(null, user.id);
});
passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});


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

现在在路由/登录中.js

var mongoose = require('mongoose');
var db = mongoose.createConnection('localhost', 'authTest');
var authSchema = mongoose.Schema({ 
    username: 'string',
    password: 'string'
});
var User = db.model('users', authSchema);
exports.index = function(req, res){
User.find(function (err, list) {
        res.render('login', { title: 'Usernames and Passwords', users: list,msg:""});
    });
};

谢谢你的时间。

您正在使用

if (!user.validPassword(password)) {
    return done(null, false, { message: 'Incorrect password.' });
}

但您尚未定义validPassword方法。将其附加到架构:

var authSchema = mongoose.Schema({ 
    username: 'string',
    password: 'string'
});
authSchema.methods.validPassword = function( pwd ) {
    // EXAMPLE CODE!
    return ( this.password === pwd );
};

编辑 您还错误地定义了架构。它应该是:

var authSchema = mongoose.Schema({ 
    username: String,
    password: String
});

请注意,usernamepassword 都应该是 String 类型的对象,而不是字符串 "string" ,如果你明白我的意思。 :)

看起来你从passportjs网站上复制了示例,Jared没有提到如何实现它。

在passport js github页面上,他有另一个(更简单的)例子;他完全删除了validPassword方法(第18行):

if (user.password != password) { return cb(null, false); }

这就是我基于我的应用程序(使用加密)的基础。

作为一个菜

鸟,我花了一整天的时间才弄清楚这一点。我使用了 Jared 的另一个示例应用程序的历史记录以及这里人们的一些加密建议。

首先,我制作了一个生成盐(一个字符串化的大随机数)的方法,使用盐和用户的密码创建一个哈希(在nodejs"crypto"模块的帮助下),最后在猫鼬保存新帐户之前每次存储盐和哈希。

//make hash
userSchema.pre('save', function(next) {
    var user = this;
    if(!user.isModified('password')) return next();
    var rand = (Math.floor(Math.random() * 1000000000)).toString(36);
    var hash = crypto.createHash('md5').update(user.password + rand).digest("hex");
    user.password = hash;
    user.salt = rand;
    next();
});

为了验证,我只需输入密码(登录时)并尝试使用盐再次创建相同的哈希。然后,我将存储的哈希值与新哈希值进行比较,并相应地返回 true 或 false。

 // Password verification
    userSchema.methods.validPassword = function(password) {
      var testhash = crypto.createHash('md5').update(password + this.salt).digest("hex");
      if(testhash === this.password) {
        return true;
      } else {
        return false;
      }
    }

相关内容

最新更新