2016-03-29 80 views
1

我有一個問題,我沒有得到一個想法,爲什麼用戶存儲對象不返回密碼在model/user.js中的validatePassword函數。我遵循passportjs官方文檔中描述的所有步驟。passportjs用戶對象不返回密碼比較密碼

我使用passportjs的localstategy進行登錄。當我比較電子郵件它總是比較,但當我試圖執行驗證密碼,並使用this.password或作爲參數它總是空白,這就是爲什麼我的密碼沒有比較。

我得到了所有的用戶模式信息,但我沒有在用戶對象中獲取密碼,所以我無法比較它。

任何人都可以告訴我怎麼能擺脫這個問題?

控制檯登錄

[email protected]:/var/www/html/mytripmean/trunk# nodejs server.js 
    Mytrip is listening on port 1000 
    MongoDB connection successful 
    ---- User Information ---- 
    [email protected] 
    [email protected]@123 
    { message: 'Incorrect password.' } 
    not user: 
    false 
    [Error: Illegal arguments: string, undefined] 

    /var/www/html/mytripmean/trunk/app/data/models/user.js:105 
       throw err; 
        ^
    Error: Illegal arguments: string, undefined 
     at Error (<anonymous>) 
     at Object.bcrypt.compare (/var/www/html/mytripmean/trunk/node_modules/bcryptjs/dist/bcrypt.js:250:42) 
     at model.userSchema.methods.validPassword (/var/www/html/mytripmean/trunk/app/data/models/user.js:102:12) 
     at Query.<anonymous> (/var/www/html/mytripmean/trunk/app/data/routes/user.js:222:27) 
     at /var/www/html/mytripmean/trunk/node_modules/kareem/index.js:177:19 
     at /var/www/html/mytripmean/trunk/node_modules/kareem/index.js:109:16 
     at process._tickCallback (node.js:448:13) 

型號/ user.js的

var mongoose = require('mongoose') 
      , Schema = mongoose.Schema 
      , ObjectId = Schema.ObjectId 
      , randtoken = require('rand-token') 
      , bcrypt = require("bcryptjs"); 

    var userSchema = new Schema({ 
    // _Id: objectId, 
     social_id: { 
      type: String, //(Social id of facebook/twitter) 
      required: false, 
      unique: false 
     }, 
     social_media: { 
      type: String, //(facebook/twitter) 
      required: false, 
      unique: false 
     }, 
     link_id: { 
      type: String, //will be dispalying as user reference in url 
      required: true, 
      unique: true 
     }, 
     nick_name: { 
      type: String, // Unique Nickname for signup 
      required: true, 
      unique: true 
     }, 
     email: { 
      type: String, // Unqiue Email for signup 
      required: true, 
      unique: true 
     }, 
     password: { 
      type: String, // Password 
      required: true, 
      select: false 
     }, 
     user_type: { 
      type: Number, // 1: SuperAdmin, 2: Admin, 3: SiteUser, 4: Restaurant 
      required: true 
     }, //reason_to_close: String, // Close Account 
     is_active: { 
      type: Number, // -1: pending to activation, 0: inactive, 1: active, 
      required: true 
     }, 
     is_close: { 
      type: Number, // -1: pending to close/Undecided, 0: closed , 1: open/ not close, 
      required: true 
     }, 
     is_online: { 
      type: Number, // 0: Offline, 1: Online 
      required: true 
     }, 
     created_at: { 
      type: Date, 
      default: Date.now 
     }, // Registration date 
     updated_at: { 
      type: Date, // Registration activation date/user update date 
      default: Date.now 
     } 
    }, {collection: 'user'}); 

    // Password verification 
    userSchema.methods.validPassword = function (candidatePassword, callback) { 
     bcrypt.compare(candidatePassword, this.password, function (err, isMatch) { 
      console.log(err); 
      if (err) { 
       throw err; 
      } 
      callback(null, isMatch); 
     }); 
    }; 

    var User = module.exports = mongoose.model("User", userSchema); 

    module.exports.checkEmail = function (callback) { 
     return this.model('User').count({email: this.email}, callback); 
    }; 

    module.exports.validateEmailOrNickname = function (username, callback) { 
     var orCondition = [{nick_name: username}, {email: username}]; 
     //return this.model("user").findOne().or(orCondition); 
     return this.model("User").find({$or: orCondition}, callback); 
    }; 

    module.exports.getUserById = function (id) { 
     User.findById(id, callback); 
    }; 

    module.exports.createUser = function (user, callback) { 
     bcrypt.genSalt(10, function (err, salt) { 
      bcrypt.hash(user.password, salt, function (err, hash) { 
       user.password = hash; 
       user.save(callback); 
      }); 
     }); 
    }; 

路線/ user.js的

var express = require('express'); 
    var router = express.Router(); 
    var bcrypt = require("bcryptjs") 
    var User = require('../models/user'); 
    var UserProfile = require('../models/userProfile'); 
    var UserSignupToken = require('../models/userSignupToken.js'); 
    var IpLogger = require('../models/ipLogger.js'); 
    var passport = require("passport"); 
    var localStrategy = require("passport-local"), Startegy; 

    router 
      .route('/api/user/register') 
      .post(
        function (req, res, next) { 

         var user_, userData_; 
         userData_ = { 
          link_id: req.body.manLinkId, 
          nick_name: req.body.txtNickname, 
          email: req.body.txtEmail, 
          password: req.body.manPassword, 
          user_type: req.body.manUserType, 
          is_active: req.body.manIsActive, 
          is_close: req.body.manIsClose, 
          is_online: req.body.manIsOnline 
         }; 

         user_ = new User(userData_); 

         user_.validate(function (err) { 
          if (err) { 

          } else { 
           //check recaptch is validate or not 
           var request = require('request'); 
           request 
             .post({ 
              url: 'http://www.google.com/recaptcha/api/verify', 
              form: { 
               privatekey: process.env.RECAPTCHA_PRIVATE_KEY, 
               remoteip: req.connection.remoteAddress, 
               challenge: req.body.captcha.challenge, 
               response: req.body.captcha.response 
              } 
             }, function (err, httpResponse, body) { 
              if (body.match(/false/) === null) { 
               //Recaptcha validated 
               User.createUser(user_, function (err, data) { 
                if (err) { 
                 console.log("stpe 1:"); 
                 console.log(err); 
                 res.json({status: 0, message: 'User having an error on stage 1'}); 
                } else { 
                 res.locals.user = data; 
                 //res.json({error:1, message: 'User saved'}); 
                 next(); 
                } 
               }); 
               //res.json({ "captchaError": true }); 
              } else { 
               res.json({"captchaError": false}); 
              } 
             }); 
          } 
         }); 
        }, 
        function (req, res, next) { 
         var userProfileData_, userProfile_; 
         userProfileData_ = { 
          user_id: res.locals.user.id, 
          link_id: res.locals.user.link_id, 
          full_name: req.body.txtFullname, 
          is_active: -1 
         }; 
         userProfile_ = new UserProfile(userProfileData_); 
         userProfile_.save(function (err, data) { 
          if (err) { 
           console.log("stpe 2:"); 
           console.log(err); 
           res.json({status: 0, message: 'User having an error on stage 2'}); 
          } else { 
           //res.json({error:1, message: 'User profile generated'}); 
           next(); 
          } 
         }); 
        }, 
        function (req, res, next) { 
         var userSignupTokenData_, userSignupToken_; 
         userSignupTokenData_ = { 
          user_id: res.locals.user.id, 
          link_id: res.locals.user.link_id, 
          is_active: -1 
         }; 
         userSignupToken_ = new UserSignupToken(userSignupTokenData_); 
         userSignupToken_.save(function (err, data) { 
          if (err) { 
           console.log("stpe 3:"); 
           console.log(err); 
           res.json({status: 0, message: 'User having an error on stage 3'}); 
          } else { 
           //res.json({error:1, message: 'User signup token generated'}); 
           next(); 
          } 
         }); 
        }, 
        function (req, res, next) { 
         var ipLoggerData_, ipLogger_, client_IP; 
         ipLoggerData_ = { 
          user_id: res.locals.user.id, 
          link_id: res.locals.user.link_id, 
          client_ip: req.ip, 
          activity: "signup" 
         }; 
         ipLogger_ = new IpLogger(ipLoggerData_); 
         ipLogger_.save(function (err, data) { 
          if (err) { 
           console.log("stpe 4:"); 
           console.log(err); 
           res.json({status: 0, message: 'User having an error on stage 4'}); 
          } else { 
           res.json({status: 1, message: 'user saved'}); 
          } 
         }); 
        } 
      ); 
    //Check unique validation 
    router 
      .route('/api/user/authenticate') 
      .post(
        function (req, res, next) { 
         console.log("---- User Information ----"); 
         console.log(req.body.txtSigninEmail); 
         console.log(req.body.txtSigninPassword); 

         passport.authenticate('local', function (err, user, info) { 
          console.log(info); 
          if (err) { 
           console.log(err); 
           return next(err); 
          } 
          if (!user) { 
           console.log("not user:"); 
           console.log(user); 
           return res.status(401).json({ 
            err: info 
           }); 
          } 
          req.login(user, function (err) { 
           if (err) { 
            return res.status(500).json({ 
             err: 'could not login user' 
            }); 
           } 
           res.status(200).json({ 
            status: 'login successful' 
           }); 
          }); 
         })(req, res, next); 
        }); 
    router 
      .route('/api/user/checkEmail') 
      .post(
        function (req, res) { 
         User.count({email: req.body.txtSigninPassword}, function (err, user) { 
          if (err) { 
           // console.log("error false"); 
           res.json(false); 
          } else { 
           // console.log("data"); 
           // console.log(user); 
           res.json({"status": user > 0 ? false : true}); 
          } 
         }); 
        }); 


    passport.serializeUser(function (user, done) { 
     done(null, user.id); 
    }); 

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


    passport.use('local', new localStrategy(
      { 
       usernameField: 'txtSigninEmail', 
       passwordField: 'txtSigninPassword' 
      }, 
      function (username, password, done) { 
       User.findOne({email: 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); 
       }); 
      } 
    )); 
    module.exports = router; 
+1

看起來像this.password傳遞給bcrypt.compare()是不確定的。檢查這是指什麼,以及這個密碼是什麼。 – Syberic

+0

我嘗試過的syberic沒有包含所有必需的模塊。基本問題是,當我試圖比較密碼時,用戶模式密碼字段返回空白。 –

回答

2

經過2個小時的努力,我找到了我的問題的答案。在我的用戶模型密碼字段中,我設置了屬性「select:false」,因爲我總是將密碼設置爲空白。

老年人:

var userSchema = new Schema({ 
     password: { 
      type: String, // Password 
      required: true, 
      select: false 
     }, 
} 

後,重新設定選擇:真正的正常工作。

更新時間:

var userSchema = new Schema({ 
     password: { 
      type: String, // Password 
      required: true, 
      select: true 
     }, 
}