Passport.js как пользовательский обратный вызов с Express-Validator >> Невозможно сохранить нового пользователя в базе данных, и аутентификация работает, даже если пользователь существует - PullRequest
0 голосов
/ 13 ноября 2018

Я часами ломал голову над этим: - /

Я пытаюсь включить экспресс-проверки, прежде чем 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);
       };
    });
...