Как обновить пароль bcrypt в nodejs? - PullRequest
0 голосов
/ 09 июля 2019

Итак, у меня есть этот роутер, где, когда администратор добавляет нового сотрудника, пароль хэшируется, он отлично работает в маршруте добавления / персонала, но когда администратор пытается обновить пароль, пароль больше не получает хэш, плюс когда этот пользователь логин с этим новым паролем, он всегда говорит неверный пароль (очевидно, который я определил), может кто-нибудь, пожалуйста, помогите мне?

//Adding the staff which works perfectly fine   
router.post(
      "/add/staff",
      passport.authenticate("jwt", { session: false }),
      (req, res) => {
        if (req.user.isAdmin === true) {
          const newUser = new User({
            name: req.body.name,
            email: req.body.email,
            role: req.body.role,
            password: req.body.password
          });
          if (req.body.adminCode === "admin123") {
            newUser.isAdmin = true;
          }
          bcrypt.genSalt(10, (err, salt) => {
            bcrypt.hash(newUser.password, salt, (err, hash) => {
              if (err) {
                res.json({ success: false, msg: "Failed to add user" });
              } else {
                newUser.password = hash;
                newUser
                  .save()
                  .then(user => {
                    res.json({ success: true, msg: "User added" });
                  })
                  .catch(ex => {
                    return res.status(500).send("Something went wrong");
                  });
              }
            });
          });
        } else {
          return res.json("Acess denied");
        }
      }
    );



//The update route which does not hash the password 
    router.put(
  "/update/:id",
  passport.authenticate("jwt", { session: false }),
  (req, res) => {
    if (req.user.isAdmin === true) {
      User.update(
        { _id: req.params.id },
        {
          name: req.body.name,
          email: req.body.email,
          role: req.body.role,
          password: req.body.password,
          password2: req.body.password2
        }
      )
        .then(success => res.json({ msg: "Updated Successfully" }))
        .catch(err => res.json(err));
    }
  }
);

А также я использую паспорт и JWT

const JwtStrategy = require("passport-jwt").Strategy;
const ExtractJwt = require("passport-jwt").ExtractJwt;
const mongoose = require("mongoose");
const User = mongoose.model("users");
const keys = require("./dbSecretKeys");

let opts = {};
// opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme("jwt");
opts.secretOrKey = keys.secretOrKey;

module.exports = passport => {
  passport.use(
    new JwtStrategy(opts, (jwt_payload, done) => {
      User.findById(jwt_payload.id)
        .then(user => {
          if (user) {
            return done(null, user);
          }
          return done(null, false);
        })
        .catch(err => console.log(err));
    })
  );
};

Это тот, который я пробовал

router.put(
  "/update/:id",
  passport.authenticate("jwt", { session: false }),
  (req, res) => {
    if (req.user.isAdmin === true) {
      User.updateOne(
        { _id: req.params.id },
        {
          name: req.body.name,
          email: req.body.email,
          role: req.body.role,
          password: req.body.password
        }
      )
        .then(userUpdateData => {
          bcrypt.genSalt(10, (err, salt) => {
            bcrypt.hash(userUpdateData.password, salt, (err, hash) => {
              if (err) {
                res.json({ success: false, msg: "Failed to update user" });
              } else {
                userUpdateData.password = hash;
                userUpdateData
                  .save()
                  .then(user => {
                    res.json({ success: true, msg: "User updated" });
                  })
                  .catch(ex => {
                    return res.status(500).send("Something went wrong");
                  });
              }
            });
          });
        })
        .catch(err => res.json(err));
    } else {
      return res.json("Access Denied");
    }
  }
);
...