Как я могу реализовать сложность joi-password в проверке Joi? - PullRequest
0 голосов
/ 11 февраля 2020

Я хочу усилить сложность пароля, используя пакет joi-password-сложно при регистрации пользователей.

https://github.com/kamronbatman/joi-password-complexity

Я пытался, но получил следующее ошибка:

(узел: 14872) UnhandledPromiseRejectionWarning: AssertionError [ERR_ASSERTION]: недопустимое содержимое схемы: (пароль. $ _ root .alternatives)

Это код, который я использую:

const mongoose = require("mongoose");
const Joi = require("joi");
const passwordComplexity = require("joi-password-complexity");

const complexityOptions = {
  min: 5,
  max: 250,
  lowerCase: 1,
  upperCase: 1,
  numeric: 1,
  symbol: 1,
  requirementCount: 2,
};

const userSchema = new mongoose.Schema({
  name: {
    type: String,
    minlenght: 1,
    maxlength: 55,
    required: true
  },
  email: {
    type: String,
    minlength: 5,
    maxlength: 255,
    unique: true,
    required: true
  },
  password: {
    type: String,
    minlength: 5,
    maxlength: 1024,
    required: true
  }
})

const User = mongoose.model("User", userSchema);

function validateUser(user) {
  const schema = {
    name: Joi.string().min(1).max(55).required(),
    email: Joi.string().min(5).max(255).required().email(),
    password: passwordComplexity(complexityOptions) // This is not working
  }
  return Joi.validate(user, schema);
}

exports.User = User;
exports.validate = validateUser;

Я также пытался следовать этому примеру: https://forum.codewithmosh.com/d/215-joi-password-complexity-problem, но он выглядит устаревшим, поскольку ключевое слово "new" вызовет другую ошибку (не конструктор) ).

Любая помощь приветствуется!

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Не удалось воспроизвести вашу точную ошибку, но у меня была такая штука:

  • @hapi/joi: ^17.1.0 (последняя на момент написания, также работает с 16.1.8)
  • joi-password-complexity: ^4.0.0 (также последний)

Код:

function validateUser(user) {
  // no change here
  const schema = Joi.object({
    name: Joi.string().min(1).max(55).required(),
    email: Joi.string().min(5).max(255).required().email(),
    password: passwordComplexity(complexityOptions) // This is not working
  });
  // note that we call schema.validate instead of Joi.validate
  // (which doesn't seem to exist anymore)
  return schema.validate(user);
}
0 голосов
/ 19 февраля 2020

Вот как я решил проблему: если вы используете joi@14.3.1 или старше, то установите joi-password-complexity@2.0.1, затем попробуйте этот код:

User.js model

const mongoose = require("mongoose");
const Joi = require("joi");
const PasswordComplexity = require("joi-password-complexity");

const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    trim: true
  },
  email: { type: String, required: true, unique: true },
  password: { type: String, required: true }
});

const User = mongoose.model("User", userSchema);

function validateUser(user) {
  const schema = {
    name: Joi.string()
      .min(3)
      .max(50)
      .required(),
    email: Joi.string()
      .email()
      .max(255)
      .required(),
    password:  new PasswordComplexity({
    min: 8,
    max: 25,
    lowerCase: 1,
    upperCase: 1,
    numeric: 1,
    symbol: 1,
    requirementCount: 4
  });
  };
  return Joi.validate(user, schema);
}

module.exports.validate = validateUser;
module.exports.User = User;

Это подтвердит сложность пароля, но для создания пароля ТРЕБУЕТСЯ вам должны подтвердить это в вашем маршруте ...

Users.js route

const _ = require("lodash");
const express = require("express");
const { User, validate } = require("../models/user");

const router = express.Router();

//POST
router.post("/", async (req, res) => {
  const { error } = validate(req.body);
  if (error) return res.status(400).send(error.details[0].message);
  //
  if (!req.body.password) return res.status(400).send("Password is required..");

  let user = await User.findOne({ email: req.body.email });
  if (user) return res.status(400).send("User already registered..");

  user = new User(_.pick(req.body, ["name", "email", "password"]));
  await user.save();
  res.send(_.pick(user, ["_id", "name", "email"]));
});

module.exports = router;
...