ValidationError с Passport.js

Вначале я упомяну, что я новичок в программировании, node, js и особенно в паспорте / аутентификации в целом. Я неустанно искал и нашел похожие проблемы в стеке, но не могу сформулировать решение на основе найденных мной ответов. Я прошу прощения за длинный вопрос, и если он нарушает какой-либо этикет ТАК.

Я знаю, что вводимые пользователем значения правильно передаются из формы ejs в мою функцию authController (я могу регистрировать каждое в консоли через req.body ...). Я также знаю, что моя база данных работает правильно, поскольку я обращался к ней в других областях. На основании своих исследований я подозреваю, что пароль может быть передан как объект и каким-то образом не сериализован должным образом. При этом в моем файле app.js я обязательно сделаю следующее, что, по моему мнению, должно избежать этой проблемы:

var User = require('./models/users');
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

Я получаю следующую ошибку:

ValidationError: User validation failed: user_password: Path `user_password` is required.

 message: 'Path `user_password` is required.',
    name: 'ValidatorError',
    properties: [Object],
    kind: 'required',
    path: 'user_password',
    value: undefined,
    reason: undefined,
    '$isValidatorError': true 

/models/users.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var passportLocalMongoose = require('passport-local-mongoose');

var UserSchema = new Schema(
  {
    first_name: {type: String, required: true, max:100},
    last_name: {type:String, required: true, max: 100},
    email_address: {type: String, required:true, max: 100},
    username: {type:String, required: true, max: 100},
    user_password: {type: String, required:true, max: 100}
  }
);

UserSchema.plugin(passportLocalMongoose);


module.exports = mongoose.model('User', UserSchema);

authController.js

userController.doRegister = function(req, res) {
  console.info(req.body.user_password);
  var newUser = new User({
    first_name: req.body.first_name,
    last_name: req.body.last_name,
    email_address: req.body.email_address,
    username: req.body.username
  });
  User.register(newUser, req.body.user_password, function(err, user) {
    if (err) {
      console.info(err);
      return res.render('register', { user : user });

    }

    passport.authenticate('local')(req, res, function () {
      res.redirect('/');

      console.info('reached end of doregister in auth contro');
    });
  });
};

register.ejs

 <table>
            <tr><td>First Name</td><td><input type = "text" name = "first_name" ></td></tr>
            <tr><td>Last Name</td><td><input type = "text" name = "last_name" ></td></tr>
            <tr><td>Email Address</td><td><input type = "text" name = "email_address" ></td></tr>
            <tr><td>Username</td><td><input type = "text" name = "username" ></td></tr>
            <tr><td>Password</td><td><input type = "text" name = "user_password" ></td></tr>
            <tr><td colspan = "3"><input type = "submit" value = "Register" ></td></tr>
        </table>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
413
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как я вижу, ваша ошибка, вероятно, связана с этим:

var newUser = new User({
    first_name: req.body.first_name,
    last_name: req.body.last_name,
    email_address: req.body.email_address,
    username: req.body.username
 });

Здесь у вас должен быть user_password

var newUser = new User({
    first_name: req.body.first_name,
    last_name: req.body.last_name,
    email_address: req.body.email_address,
    username: req.body.username,
    user_password: req.body.user_password
});

Поскольку это необходимо, вы не можете создать нового пользователя без него. Лучшим подходом является обработка пароля в перед сохранением, там вы хешируете и проверяете его.

Да или нет, настоящая проблема входа не здесь. Но вы были абсолютно правы, должна быть ошибка валидации, так как user_password является обязательным полем.

Leo Li 23.04.2018 19:37

Он опубликовал ошибку Mongoose ValidationError: ValidationError: Ошибка проверки пользователя: user_password: Требуется путь user_password.

desoares 23.04.2018 19:49

Согласовано. Но это неправильный способ решения проблемы. Если OP принимает ваш ответ, проблема все еще существует, он не собирается входить в систему пользователя. Очевидно, OP не до конца понимает, как работает заграничный пасспорт, в схеме не должно быть поля пароля вообще, вместо этого оно должно быть добавлено паспорт-местный-мангуст.

Leo Li 23.04.2018 19:56
Ответ принят как подходящий

Прежде всего, вы не хотите обрабатывать пароль пользователя в своей схеме (т.е. удалить user_password из своей пользовательской схемы). Это небезопасно, так как вы не хешировали и не добавляли свой пароль пользователя, это также причина, по которой вы хотите использовать библиотеку заграничный пасспорт. Поскольку, очевидно, вы не хотите касаться хеширования и соления паролей, просто позвольте паспорт-местный-мангуст сделать это за вас.

Далее, настоящая проблема в промежуточном программном обеспечении вашего контроллера заключается в том, что вы не передали объект мангуста user в req.login. passport.authenticate('local', (err, authUser) => { (do_something) }) - это промежуточное программное обеспечение, которое дает вам объект аутентифицированного пользователя после обратного вызова, но не заполняет объект req.user, пока вы не решите «войти» пользователя. Поэтому вам следует попробовать следующее:

userController.doRegister = function(req, res) {
  console.info(req.body.user_password);

  const newUser = new User({
    first_name: req.body.first_name,
    last_name: req.body.last_name,
    email_address: req.body.email_address,
    username: req.body.username
  });

  User.register(newUser, req.body.user_password, function(err, user) {
    if (err) {
      console.info(err);
      return res.render('register', { user : user });
    }

    req.login(user, err => {
      if (err) throw err;
      console.info('reached end of doregister in auth contro');
      return res.redirect('/');
    });

  });
};

Примечание: пожалуйста, не используйте var, так как теперь у нас есть const.

Большое спасибо за ваш ответ - он очень полезен. Одно изменение, которое я внес перед его компиляцией, как ожидалось, заключалось в замене res.logIn на req.login. Теперь он работает, еще раз спасибо!

demongman 23.04.2018 21:13

Другие вопросы по теме