Home > Software design >  Make the HTTPs request wait till password is encrypted
Make the HTTPs request wait till password is encrypted

Time:11-18

So i need to create a post request that gets login data(name, email, password) from the user, runs validations, encrypts password, then stores data. The problem is that the encryption function takes time to run, and the variable is still not populated by the time i use it. Tried using another promise-await inside but didn't work. How do i wait till encryptedPass is not null?

// Bcrypt import, initialize number of rounds of salting
saltRounds = 10;

router.post('/user/create', bodyPraser.json(), async (req, res) => {

        // Some code here that runs validations

        // Encrypting password 
        var passwordToEncrypt = req.body.password;
        var encryptedPass;

        // MongoDB model to store data
        const encryptedData = new Model({
            fullname: req.body.fullname,
            email: req.body.email,
            password: encryptedPass
        });
    
        // Salting function
        bcrypt.genSalt(saltRounds, function (err, salt) {
            // Hashing function
            bcrypt.hash(passwordToEncrypt, salt, function (err, hash) {
                // Store hash in database here
                encryptedPass = hash;
            });
        });


        // Save, and store data. Sedn success.
        const dataToSave = await encryptedData.save(); // The password is still null at this point
        res.status(200).json(dataToSave);
        console.log("Data saved");
    }

    catch (error) {
        res.status(400).json({ message: error.message });
        console.log("Data not saved!");
    }
})

CodePudding user response:

Here's the modified code. I just put everything under your salt function, because everything depends on salt.

// Bcrypt import, initialize number of rounds of salting
saltRounds = 10;

router.post('/user/create', bodyPraser.json(), async (req, res) => {

        // Some code here that runs validations
        
        // Salting function
        bcrypt.genSalt(saltRounds, function (err, salt) {
            // Hashing function
            bcrypt.hash(req.body.password, salt, function (err, hash) {
                if(err){
                    res.status(400).json({message: 'Something went wrong'});
                } else {
                    // MongoDB model to store data
                    const encryptedData = new Model({
                        fullname: req.body.fullname,
                        email: req.body.email,
                        password: hash
                    });
                    // Save, and store data. Sedn success.
                    const dataToSave = await encryptedData.save();
                    res.status(200).json(dataToSave);
                }
            }
            });
        });
    }

    catch (error) {
        res.status(400).json({ message: error.message });
        console.log("Data not saved!");
    }
})

CodePudding user response:

You need to store data in database at the time once the password is hashed and then do it you are doing it before the password is hashed and you are getting the wrong results,

PTR: Also avoid using var instead use let because it's a bad practice

Do this instead

// Bcrypt import, initialize number of rounds of salting
saltRounds = 10;

router.post('/user/create', bodyPraser.json(), async (req, res) => {
    try {
        // Some code here that runs validations

        // Encrypting password 
        let passwordToEncrypt = req.body.password;
        let encryptedPass;
        let encryptedData

        // MongoDB model to store data


        // Salting function
        bcrypt.genSalt(saltRounds, function (err, salt) {
            if (err) {
                return res
                    .status(400)
                    .json({
                        message: 'Something went wrong'
                    });
            } else {
                // Hashing function
                bcrypt.hash(passwordToEncrypt, salt, function (err, hash) {
                    if (err) {
                        return res
                            .status(400)
                            .json({
                                message: 'Something went wrong'
                            });
                    } else {
                        // Store hash in database here
                        encryptedPass = hash;
                        encryptedData = new Model({
                            fullname: req.body.fullname,
                            email: req.body.email,
                            password: encryptedPass
                        });
                    }

                });
            }

        });

        // Save, and store data. Sedn success.
        const dataToSave = await encryptedData.save(); // The password is still null at this point
        console.log("Data saved");
        return res
            .status(200)
            .json(dataToSave);

    }
    catch (error) {
        console.log("Data not saved!");
        return res
            .status(400)
            .json({
                message: error.message
            });

    }
});
  • Related