我正在测试已经存在的帐户的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);
我已经做了更多的挖掘,问题可能是当电子邮件注册一次并再次尝试创建帐户时,用户被传递为false passport.serializeUser()
答案 0 :(得分: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);