Я часами ломал голову над этим: - /
Я пытаюсь включить экспресс-проверки, прежде чем Passport аутентифицируется, чтобы новый пользователь мог зарегистрироваться / зарегистрироваться.
Из чтения в Интернете и множества учебных пособий я понимаю, что Паспорт необходимо использовать в качестве настраиваемого обратного вызова (http://www.passportjs.org/docs/authenticate/), если проверки вальдидейта должны использоваться первыми. Однако я пробовал много разных вариантов ипроверки работают, и паспорт аутентифицируется без добавления нового пользователя в базу данных mongodb, или я могу зарегистрировать новое электронное письмо, несмотря на то, что электронное письмо этого пользователя уже существует.
Любая помощь очень ценится! Пожалуйста, дайте мне знать, если вам нужнобольше кода / информации от меня. Заранее спасибо!
Файл User.js
var mongoose = require('mongoose');
var bcrypt = require('bcrypt-nodejs');
var userSchema = mongoose.Schema({
local : {
email : String,
password : String,
fname : String,
lname : String,
role : String,
}
});
// generating a hash =============
userSchema.methods.generateHash = function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(12), null);
};
// checking if password is valid
userSchema.methods.validPassword = function(password) {
return bcrypt.compareSync(password, this.local.password);
};
module.exports = mongoose.model('User', userSchema);
Файл Passport.js
passport.use('local-signup', new LocalStrategy({
// by default, local strategy uses username and password, we will override with email
usernameField : 'email',
passwordField : 'password',
passReqToCallback : true },
function(req, password, email, done) {
//specify new variables (As well as password & email already captured in function)
var fname = req.body.fname;
var lname = req.body.lname;
var role = req.body.role;
User.findOne({ 'local.email' : email }, function(err, user, req) {
// if there are any errors, return the error
if (err)
return done(err);
// check to see if theres already a user with that email
if (user) {
return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
} else {
// if there is no user with that email
// create the user
var newUser = new User();
// set the user's local credentials
newUser.local.email = email;
newUser.local.password = newUser.generateHash(password);
newUser.local.fname = fname;
newUser.local.lname = lname;
newUser.local.role = role;
// save the user
newUser.save(function(err) {
if (err)
throw err;
return done(null, newUser);
});
}
});
}));
Файл Routes.js
app.post('/signup',
check('email')
.not().isEmpty().withMessage('Please specify an email.')
.isEmail().withMessage('Incorrect email format.'),
check('password')
.not().isEmpty().withMessage('Please specify a password.')
.matches(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.* )(?=.*[^a-zA-Z0-9]).{8,}$/, 'i').withMessage('Password must include 1 uppercase character, 1 number and 1 special character')
.isLength({min: 8, max: 100}).withMessage('Password must be at least 8 characters in length.'),
check('fname')
.not().isEmpty().withMessage('Please enter your first name.'),
check('lname')
.not().isEmpty().withMessage('Please enter your last name.'),
check('role')
.not().isEmpty().withMessage('Please state your role.'),
function(req, res, next) {
var errors = validationResult(req);
if (!errors.isEmpty()) {
return res.render('signup.html', {message: errors.array()[0].msg});
} else {
passport.authenticate('local-signup', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/signup'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/profile');
});
})(req, res, next);
};
});