javascript - Passport 和 Mongoose 的 bcrypt 错误

标签 javascript node.js mongodb passport.js bcrypt

Bcrypt 抛出一个 Incorrect arguments 错误,我追溯到 user.js 中的这个函数

userSchema.methods.comparePassword = (candidatePassword, callback) => {
  bcrypt.compare(candidatePassword, this, (err, isMatch) => {
    console.log('candidatePassword= ', candidatePassword, '&  this= ', this);
    if (err) { return callback(err); }
    callback(null, isMatch);
  });
};

   /* 
     candidatePassword=  bird
     this=  {}
     this.password=  undefined */

用户对象作为空对象返回,因此 this.password 未定义。我假设 bcrypt.compare 中的 this 参数指的是 userSchema 实例。 userSchema 在 passport.js

中声明
const passport = require('passport');
const ExtractJwt = require('passport-jwt').ExtractJwt;
const JwtStrategy = require('passport-jwt').Strategy;
const LocalStrategy = require('passport-local').Strategy;

const User = require('../models/user');
const config = require('../config');

var localOptions = {
  usernameField: 'email',
};

// Verifies user by checking if a password matches the specified email during signin
var localStrategy = new LocalStrategy(localOptions, function (email, password, done) {
  User.findOne({ email:email.toLowerCase()}, function (err, user) {
    console.log('/passport.js/localStrategy- user object: ', user)
    if (err) { return done(err); }
    if (!user) { return done(null, false); }
    user.comparePassword(password, function (err, isMatch) {
      console.log('/passport.js/localStrategy- password: ', password)
      if (err) { return done(err); }
      if (!isMatch) { return done(err, false); }
      return done(null, user);
    });
  });
}); 

// ... jwt strategy ...

passport.use(localStrategy);

/* 
  user object:  { _id: 58a1018dc3f89eb5955b8638,
  email: 'bird@bird.com',
  password: '$2a$10$lAJ9hoGKt9ggfk1TISfkOedxDIs/waLB5e4PccHAKt286XCKCY0/q',
  __v: 0 } */

我不太确定问题是什么,因为它似乎从 mongodb 返回一个带有加密密码字段的用户对象,并且调用了 user.comparepassword()...

我也使用相同的 Schema 对象为用户注册。

感谢任何帮助/提示!

最佳答案

您只是在设置您的模型,以便它提取 candidatePassword 但永远不会从数据库中找到存储的密码。由于这将返回一个空对象,因此电子邮件不匹配或密码未与存储的内容进行比较。尝试简化 comparePassword 函数并将“sync”添加到 bcrypt.compare,这样就不需要回调了。

在模型中:

userSchema.methods.comparePassword = (candidatePassword) => {
    return bcrypt.compareSync(candidatePassword, this.password);
};

关于javascript - Passport 和 Mongoose 的 bcrypt 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42195799/

相关文章:

node.js - 使用集合而不是 Mongoose 中的模型查找值

python 算法: how to efficiently find if two integer sets are intersected?

javascript - 如何在延迟后调用owlCarousel函数?

javascript - 在嵌套对象中搜索特定键的值

node.js - 端口转发无法设置本地 Web 服务器

ruby - 如何使用 Sinatra 中的 MongoMapper 访问 Mongo 数据库键以在 Haml View 中呈现值?

linux - 升级到 Ubuntu 15.04 后 MongoDB 服务不工作

javascript - 带有表单条件的 ng-show 不适用于 AngularJS 中的指令模板

javascript - Promise 链没有解析;正确的修复方法是什么?

javascript - 对原始 html 输出的文本进行一致的解析