0

我正在测试local-signup一个已经存在的帐户的序列化,但我抛出了一个错误(这似乎不正确)。该错误不会引发原始注册(仅当我尝试重新注册时)。

//passport.js
var LocalStrategy   = require('passport-local').Strategy;
var User = require('../models/user');

module.exports = function(passport) {
  passport.serializeUser(function(user, done) {
    console.log("serialize user", user);
     done(null, user.id);
  });
  passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
      done(err, user);
    });
  });
  passport.use('local-signup', new LocalStrategy({
    usernameField : 'email',
    passwordField : 'password',
    passReqToCallback : true // allows us to pass back the entire request to the callback
  },
  function(req, email, password, done) {
    process.nextTick(function() {
      User.findOne({ 'local.email' :  email }, function(err, user) {
        // if there are any errors, return the error
        if (err)
        return done(err);
        if (user) {
          console.log("user", user);
          return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
        } else {
          var newUser  = new User();
          newUser.local.email    = email;
          newUser.local.password = newUser.generateHash(password);

          // save the user
          newUser.save(function(err) {
            if (err){
              console.log("error saving");
              throw err;
            }
            return done(null, newUser);
          });
        }

      });

    });

  }));

};

当我第二次尝试帐户时Error: Failed to serialize user into session

编辑:

// models/user.js
var mongoose = require('mongoose');
var bcrypt   = require('bcrypt');
var Schema = mongoose.Schema;

// schema for user model
var userSchema = mongoose.Schema({
  local : {
    email: String,
    password: String,
    displayName : String,
  },
});


userSchema.methods.generateHash = function(password) {
  return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};

// checking if password is valid
userSchema.methods.validPassword = function(password) {
  return bcrypt.compareSync(password, this.local.password);
};

// expose user model to the app
module.exports = mongoose.model('User', userSchema);

编辑#2:

// routes/routes.js
var User = require('../models/user');
module.exports = function(app, config, passport) {
  app.post('/signup', function(req,res, next){
    passport.authenticate('local-signup', function(err, user, info) {
      if (err) { return next(err); }
      req.logIn(user, function(err) {
        if (err) {
          console.log("err ", err);
          return next(err);
        }
        if (!user) {
          res.status(500);
          return res.send('500');
        }
        res.status(200);
        return res.send('worked');
      });
    })(req, res, next);
  });
}

这里大致是我的 app.js

var express = require('express');
var passport = require('passport');
require('./config/passport')(passport);
var app = express(); // sets up the server
app.use(session({ secret: 'damnfizzbuzzmyfoobar' }));
app.use(passport.initialize());
app.use(passport.session());
require('./routes/routes')(app, config, passport);
app.listen(3000);

我做了更多的挖掘,问题可能是当电子邮件注册一次并再次尝试创建帐户时,用户被传入为假passport.serializeUser()

4

1 回答 1

1

删除serializeUser中的else部分,然后应该可以工作。

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

用户模型

var mongoose = require('mongoose');
var bcrypt   = require('bcrypt-nodejs');

// define the schema for our user model
var userSchema = mongoose.Schema({
    local            : {
        email        : String,
        password     : String,
        displayName : String
    }
});

userSchema.virtual('password')
.set(function(password) {
        this._password = password;
        this.salt = this.makeSalt();
        this.local.password = this.encryptPassword(password);
    })
.get(function() { return this._password });

var validatePresenceOf = function (value) {
   return value && value.length;
};


// methods ======================
userSchema.methods = {
  generateHash: function(password) {
      return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
  },
  validPassword: function(password) {
      return bcrypt.compareSync(password, this.local.password);
  },
  authenticate: function (plainText) {
    return this.encryptPassword(plainText) === this.local.password;
  },
  makeSalt: function () {
    return Math.round((new Date().valueOf() * Math.random())) + '';
  },
  encryptPassword: function (password) {
    if (!password) return '';
    var encrypred;
    try {
      encrypred = crypto.createHmac('sha1', this.salt).update(password).digest('hex');
      return encrypred;
    } catch (err) {
      return '';
    }
  } 
} 

module.exports = mongoose.model('User', userSchema);
于 2015-03-11T05:13:12.430 回答