2015-02-05 3 views
0

mongodb를 사용하여 내 사용자 테이블을 저장하고 bcrypt를 사용하여 비밀번호를 저장합니다. 그러나 저장된 암호는 모두 실제 텍스트입니다. 내 노드 JS 코드는 다음과 같습니다 : 비밀번호 저장에 bcrypt를 사용하면 아무 효과가 없습니다.

{ "그 이후

var mongoose = require('mongoose') 
var bcrypt = require('bcrypt') 
var SALT_WORK_FACTOR = 10 

var UserSchema = new mongoose.Schema({ 
name:{ 
    type:String, 
    required: true, 
    unique: true 
}, 
password: { 
    type: String, 
    required: true 
} 
meta: { 
    createAt: { 
     type: Date, 
     default: Date.now() 
    }, 
    updateAt: { 
     type: Date, 
     default: Date.now() 
     } 
    } 
}) 
UserSchema.pre('save',function(next){ 
var user = this 
if(this.isNew){ 
    this.meta.createAt = this.meta.updateAt = Date.now() 
} 
else{ 
    this.meta.updateAt = Date.now() 
} 

bcrypt.genSalt(SALT_WORK_FACTOR,function(err, salt){ 
    if(err) return next(err) 
     console.log('salt'+salt) 
     bcrypt.hash(user.password, salt, function(err, hash){ 
      console.log('hash'+hash) 
      if(err) 
       return next(err) 

      console.log('set user password' + hash) 
      user.password = hash 
      next() 

     }) 
}) 

next() 
}) 

, 난 내 몽고 터미널에서 db.users.find()를 사용, 내가 보는 모든 실제 텍스트로 저장 암호입니다 _id ": ObjectId ("54d2f5a4162a7335c0036cae "),"이름 ":"12 ","암호 ":"12 ","메타 ": {"updateAt ": ISODate ("2015-02-05T04 : 46 : 28.246Z ") , "createAt": ISODate ("2015-02-05T04 : 46 : 28.246Z"), "__v": 0}

{ "_id": ObjectId ("54d2f89c0675b329c3e783d4"), "name": "34 ","password ":"34 ","meta ": {"updateAt ": ISODate ("2015-02-05T04 : 59 : 08.285Z "), "createAt": ISODate ("2015-02-05T04 : 59 : 08.285Z"), "__v": 0}

{ "_id": ObjectId ("54d2f9703b55cdf5c32af5b2"), "name": "457" , "password": "457", "meta": { "updateAt": ISODate ("2015-02-05T05 : 03 : 23.338Z"), "createAt": ISODate ("2015-02-05T05 : 03 : 23.338 Z ")},"__v는 "0}

때문에 그

, 내 비교 함수는 항상 false를 반환 :

UserSchema.methods = { 
comparePassword: function(_password, cb){ 
    bcrypt.compare(_password, this.password, function(err, isMatched){ 
     if(err) 
      return cb(err) 

     cb(null, isMatched) 
    }) 
} 
} 

누군가 나에게이 문제를 해결하는 데 도움 수 있을까요?

답변

1

내 생각 엔 bcrypt.genSalt()을 호출 한 직후에 next()이 추가 되었기 때문에 user.password의 값은 데이터베이스에 항목을 저장하기 전에 변경되지 않았습니다. 따라서 bcrypt.genSalt() 바로 뒤에 next()을 제거하면 예상대로 작동합니다.

관련 문제