护照和猫鼬的bcrypt错误

Posted

技术标签:

【中文标题】护照和猫鼬的bcrypt错误【英文标题】:bcrypt error with passport and mongoose 【发布时间】:2017-06-30 22:49:43 【问题描述】:

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 对象。

感谢任何帮助/提示!

【问题讨论】:

【参考方案1】:

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

在模型中:

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

【讨论】:

您可能还缺少序列化和反序列化部分Checkout this explaination 嗨粘土!在 passport.js 中,我的代码引入了用户对象。 console.log 语句中的文本在底部进行了注释。由于我在该方法中调用 user.comparePassword,因此我假设 bcrypt.compareSync 可以通过使用 this 作为参数在 user.js 中访问变量。成功拉入对象后,是否有原因无法通过?谢谢

以上是关于护照和猫鼬的bcrypt错误的主要内容,如果未能解决你的问题,请参考以下文章

本地护照和本地护照猫鼬的身份验证错误

尝试在打字稿中使用猫鼬和 bcrypt 比较密码

如何使用已有的 bcrypt 代码实施护照?

使用promisy重构护照本地策略。 .catch()的问题

Mongoose 比较 BCRYPT 密码未填写

bcrypt安装常见错误解决方法