Node.js when I update a user it un-hash's the password

Viewed 14

So im trying to make an admin login and I can get it to hash the password. But when I update the password or even the username it will un-hash the passwor for me when i need it to stay hashed. When I check my MongoDB itll be un-hashed for some reason. Any help will be appreciated. Thank you.

This is my user route

var express = require("express");
var router = express.Router();
const mongoose = require("mongoose");
const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
const { isAuthenticated } = require("../middleware/auth");

const Admin = require("../models/Admin");
const saltrounds = 10;

/* GET users listing. */
router.get("/", function (req, res, next) {
  res.send("respond with a resource");
});

router.post("/login", async (req, res) => {
  if (!req.body.username || !req.body.password) {
    return res.json({ message: "Please enter username and password" });
  }

  try {
    const foundUser = await Admin.findOne({ username: req.body.username });
    if (!foundUser) {
      return res
        .status(400)
        .json({ message: "Username or password is incorrect" });
    }

    const isMatch = bcrypt.compareSync(req.body.password, foundUser.password);
    if (!isMatch) {
      return res
        .status(400)
        .json({ message: "Username or password incorrect" });
    }

    const payload = {
      username: foundUser.username,
      id: foundUser._id,
    };

    const token = jwt.sign(payload, process.env.SECRET, {
      algorithm: "HS256",
      expiresIn: "6h",
    });

    res.json({ token: token, id: foundUser.id });
  } catch (err) {
    res.status(400).json(err.message);
  }
});

router.post("/update", isAuthenticated, async (req, res) => {
  try {
    const updateUser = await Admin.findByIdAndUpdate(
      req.user.id,
      { ...req.body },
      { new: true }
    );
    res.json(updateUser);
  } catch (err) {
    res.json(err.message);
  }
});

module.exports = router;

This is my authenticated folder

const jwt = require("jsonwebtoken");

const isAuthenticated = async (req, res, next) => {
  //   const token = req.headers.authorization;
  // NOTE: if your token authentication is failing in Postman, uncomment the line below, and comment out the line above
  const token = req.headers.authorization?.split(" ")[1];
  if (!token || token === "null") {
    console.log("NO TOKEN");
    return res.status(400).json({ message: "Token not found" });
  }
  try {
    const tokenInfo = jwt.verify(token, process.env.SECRET);
    console.log(tokenInfo);
    //If you have req.payload, change line 12 to:
    // req.payload = tokenInfo;
    req.user = tokenInfo;
    next();
  } catch (error) {
    return res.status(440).json(error);
  }
};

// Export the middleware so that we can use it to create a protected routes
module.exports = {
  isAuthenticated,
};

1 Answers

I think the issue is located at the (function)

Admin.findByIdAndUpdate

May be the find unhash the password fisrt and the update do not hash it again.

Check at this function.

Related