Как сделать проверку пароля в NodeJS с Mongoose - PullRequest
0 голосов
/ 27 октября 2019

У меня есть форма регистрации с именем пользователя, почтой, паролем и паролем2. Я хочу проверить пароли, которые на самом деле совпадают. Я проверяю практически все в Mongoose Scheme, но не могу найти в документации никакой полезной информации о том, как получить пароль2 без фактического сохранения его в базе данных. (У меня есть функция для шифрования пароля, который запускается только перед сохранением)

    const userSchema = new mongoose.Schema({
    username: {
        type: String,
        unique: true,
        required: true,
        trim: true,
        validate(value) {
            if (!validator.isAlphanumeric(value , 'pl-PL')) {
                throw new Error('Name cannot contain special characters.')
            }
        }
    },
    email: {
        type: String,
        unique: true,
        required: true,
        trim: true,
        lowercase: true,
        validate(value) {
            if (!validator.isEmail(value)) {
                throw new Error('Email is invalid')
            }
        }
    },
    password: {
        type: String,
        required: true, 
        validate(value) {
            console.log(value)
            if(value !== this.password2) {
                throw new Error("Passwords don't match. Try again.")
            }

            if(value.length < 8) {
                throw new Error("Passwords is too short. At least 8 characters.")
            }
        }
    },
    tokens: [{
        token: {
            type: String,
            required: true
        }
    }]
    })

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Вам не нужно делать password2 частью userSchema. Лучше всего сделать функцию сравнения пароля, например, так:

UserSchema.methods.comparePassword = function(plaintext, callback) {
    return callback(null, Bcrypt.compareSync(plaintext, this.password));
};

, также вы можете использовать Schema.pre:

UserSchema.pre("save", function(next) {
    if(!this.isModified("password")) {
        return next();
    }
    this.password = Bcrypt.hashSync(this.password, 10);
    next();
});

После этого вам нужно вызватьсравнить функцию от контроллера пользователя. Примерно так (в зависимости от вашей логики):

        var user = await UserModel.findOne({ username: request.body.username }).exec();
        if(!user) {
            return response.status(400).send({ message: "The username does not exist" });
        }
        user.comparePassword(request.body.password, (error, match) => {
            if(!match) {
                return response.status(400).send({ message: "The password is invalid" });
            }
        });

Подробно вы можете прочитать эту превосходную статью .

0 голосов
/ 27 октября 2019

Вы можете проверить пароль и пароль2 в маршруте регистрации, и если они совпадают, вы можете продолжить регистрацию.

Пример маршрута регистрации будет выглядеть так:

router.post("/register", async (req, res) => {

  try {
    const { username, email, password, password2 } = req.body;

    if (password !== password2) return res.status(400).send("Passwords dont match");

    let user = await User.findOne({ email });
    //or
    //let user = await User.findOne({ username });

    if (user) return res.status(400).send("User already registered.");

    user = new User({ username, email, password });

    user = await user.save();

    //todo: at this point you may generate a token, and send to the client in response header or body

    res.send(user);
  } catch (err) {
    console.log(err);
    res.status(500).send("Server error");
  }

});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...