Mongoose password hashing

前端 未结 10 966
盖世英雄少女心
盖世英雄少女心 2020-12-04 07:28

I am looking for a good way to save an Account to MongoDB using mongoose.

My problem is: The password is hashed asynchronously. A setter wont work here because it on

10条回答
  •  爱一瞬间的悲伤
    2020-12-04 07:50

    const mongoose = require('mongoose');
    var bcrypt = require('bcrypt-nodejs');
    SALT_WORK_FACTOR = 10;
    
    const userDataModal = mongoose.Schema({
        username: {
            type: String,
            required : true,
            unique:true
        },
        password: {
            type: String,
            required : true
        }
    
    });
    
    userDataModal.pre('save', function(next) {
        var user = this;
    
        // only hash the password if it has been modified (or is new)
        if (!user.isModified('password')) return next();
    
        // generate a salt
        bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
            if (err) return next(err);
    
            // hash the password using our new salt
            bcrypt.hash(user.password, salt, null, function(err, hash) {
                if (err) return next(err);
    
                // override the cleartext password with the hashed one
                user.password = hash;
                next();
            });
        });
    });
    
    userDataModal.methods.comparePassword = function(candidatePassword, cb) {
        bcrypt.compare(candidatePassword, this.password, function(err, isMatch) {
            if (err) return cb(err);
            cb(null, isMatch);
        });
    };
    
    
    // Users.index({ emaiId: "emaiId", fname : "fname", lname: "lname" });
    
    const userDatamodal = module.exports = mongoose.model("usertemplates" , userDataModal)
    
    
    
    //inserting document
         userDataModel.findOne({ username: reqData.username }).then(doc => {
                console.log(doc)
                if (doc == null) {
                    let userDataMode = new userDataModel(reqData);
                   // userDataMode.password = userDataMode.generateHash(reqData.password);
                    userDataMode.save({new:true}).then(data=>{
                              let obj={
                                  success:true,
                                  message: "New user registered successfully",
                                  data:data
                              }
                                resolve(obj)
                    }).catch(err=>{
                                    reject(err)
                    })
    
                }
                else {
                    resolve({
                        success: true,
                        docExists: true,
                        message: "already user registered",
                        data: doc
                    }
                    )
                }
    
            }).catch(err => {
                console.log(err)
                reject(err)
            })
    
    //retriving and checking
          // test a matching password
                    user.comparePassword(requestData.password, function(err, isMatch) {
                        if (err){ 
    
                            reject({
                                'status': 'Error',
                                'data': err
                            });
    
                            throw err;
                        } else  {
                            if(isMatch){
    
                                resolve({   
                                    'status': true,
                                    'data': user,
                                    'loginStatus' : "successfully Login"
                                });
    
                                console.log('Password123:', isMatch); // -> Password123: true
    
                            }
    

提交回复
热议问题