jarivak
jarivak

Reputation: 858

How to update Password with new password on Reset Password

The GITHUB REPO i'm using code repository

I'm trying to reset the user password on redirecting the user to reset password page. On the 1st Singup I'm hashing the password and salt is generated and stored in database using CRYPTO. On reset password the new password is not getting updated it does not allow to signin using the updated password. I tried using response.password which gives the updated password.Still couldn't figure out the solution.

Reset password :

 exports.resetPassword = (req,res) => {

    const {resetPasswordLink,  newPassword } = req.body

    if(resetPasswordLink){
            jwt.verify(resetPasswordLink,process.env.JWT_RESET_PASSWORD,  function(err,decoded){
                    if(err){
                        return res.status(401).json({
                            error : ' The Link has been expired ! , Try Again '
                        })
                    }

                    User.findOne({resetPasswordLink},(err,user)=>{
                        if(err || !user){
                            return res.status(401).json({
                                error: ' The Link has been expired ! , Try Again '
                            })
                        }

                        const updatedFields = {
                            password: newPassword,
                            resetPasswordLink: ''
                        }

                        user = _.extend(user,updatedFields)
                        user.save((err,result)=>{
                                if(err){
                                    return res.status(400).json({
                                        error: errorHandler(err)
                                    })
                                }
                                return res.json({
                                    message: ` Your Password Has Been Successfully Reset , Please Return to the SignIn Page to SignIn `
                                //    result.password
                             })
                        })
                    })
            }) 
    }
  }

UPDATE 4th August : Here's the complete USER model

User Schema :

 const mongoose = require('mongoose');
const crypto = require('crypto');

const userSchema = new mongoose.Schema(
    {
        username: {
            type: String,
            trim: true,
            required: true,
            max: 32,
            unique: true,
            index: true,
            lowercase: true
        },
        name: {
            type: String,
            trim: true,
            required: true,
            max: 32
        },
        email: {
            type: String,
            trim: true,
            required: true,
            unique: true,
            lowercase: true
        },
        profile: {
            type: String,
            required: true
        },
        hashed_password: {
            type: String,
            required: true
        },
        salt: String,
        about: {
            type: String
        },
        role: {
            type: Number,
            default: 0
        },
        photo: {
            data: Buffer,
            contentType: String
        },
        resetPasswordLink: {
            data: String,
            default: ''
        }
    },
    { timestamp: true }
);

userSchema
    .virtual('password')
    .set(function(password) {
        // create a temporarity variable called _password
        this._password = password;
        // generate salt
        this.salt = this.makeSalt();
        // encryptPassword
        this.hashed_password = this.encryptPassword(password);
    })
    .get(function() {
        return this._password;
    });

userSchema.methods = {
    authenticate: function(plainText) {
        return this.encryptPassword(plainText) === this.hashed_password;
    },

    encryptPassword: function(password) {
        if (!password) return '';
        try {
            return crypto
                .createHmac('sha1', this.salt)
                .update(password)
                .digest('hex');
        } catch (err) {
            return '';
        }
    },

    makeSalt: function() {
        return Math.round(new Date().valueOf() * Math.random()) + '';
    }
};

module.exports = mongoose.model('User', userSchema);

Upvotes: 2

Views: 436

Answers (1)

Dimple Patel
Dimple Patel

Reputation: 718

problem is in your signin function where you have set expiry of 'jwt' and 'cookie' use { expiresIn: '1d' } instead of { expiresIn: '1' } because '1' means your jwt and cookie expires in 1 ms

 const token = jwt.sign({ _id: user._id }, process.env.JWT_SECRET, { expiresIn: '1d' });
 res.cookie('token', token, { expiresIn: '1d' });

Upvotes: 2

Related Questions