首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValidationError与Passport.js

ValidationError与Passport.js
EN

Stack Overflow用户
提问于 2018-04-23 16:50:39
回答 2查看 675关注 0票数 1

首先,我要提到,我对编程、节点、js,特别是一般的护照/身份验证非常陌生。我一直在不断地搜索,并在堆栈中发现了类似的问题,但无法根据我找到的答案来制定解决方案。如果我为这个冗长的问题道歉,如果它破坏了礼仪,我很抱歉。

我知道用户输入值正正确地从ejs表单传递到我的authController函数(我可以通过req.body.在控制台中记录每个输入值)。我也知道我的数据库工作正常,因为我在其他领域访问过它。根据我的研究,有一件事我怀疑,密码可以作为一个对象传递,并且没有以某种方式正确地序列化。尽管如此,在我的app.js文件中,我肯定会做以下我认为应该避免这个问题的事情:

代码语言:javascript
复制
var User = require('./models/users');
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

我收到以下错误:

代码语言:javascript
复制
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 

/model/users.js

代码语言:javascript
复制
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

代码语言:javascript
复制
userController.doRegister = function(req, res) {
  console.log(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.log(err);
      return res.render('register', { user : user });

    }

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

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

register.ejs

代码语言:javascript
复制
 <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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-23 17:14:31

首先,您不希望在模式中处理用户密码(即删除用户模式中的user_password )。这是不安全的,因为您没有散列和盐分您的用户密码,这也是您希望使用护照库的原因。因为您显然不想接触密码散列和盐渍,所以请让passport-local-mongoose为您做。

接下来,控制器中间件中的真正问题是,您没有将user mongoose对象传递给req.loginpassport.authenticate('local', (err, authUser) => { (do_something) })是一种中间件,它为您提供了经过身份验证的用户对象的回调,但在您决定“登录”用户之前,它不会填充req.user对象。所以你应该试一试:

代码语言:javascript
复制
userController.doRegister = function(req, res) {
  console.log(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.log(err);
      return res.render('register', { user : user });
    }

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

  });
};

注意:请不要使用var,因为我们现在有了const

票数 0
EN

Stack Overflow用户

发布于 2018-04-23 17:13:23

正如我所看到的,您的错误可能与以下内容有关:

代码语言:javascript
复制
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

代码语言:javascript
复制
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
});

因为这是必需的,所以没有它就不能创建新用户。一个更好的方法是在存钱前中处理密码,在那里您可以散列并验证它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49986182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档