Я новичок в стеке MEAN, работаю над забытым паролем и сбросил пароль. Я завершил забыл пароль переднего конца с Angular 8 и узла и экспресс. Письмо отправлено на электронную почту пользователя для сброса пароля. но всякий раз, когда я нажимаю на ссылку, указанную в почтовом сообщении, показывается "Срок действия токена"
forgot password node js:-
exports.forgot_password= function(req, res){
async.waterfall([
function(done) {
crypto.randomBytes(20, function(err, buf) {
var token = buf.toString('hex');
done(err, token);
});
},
function(token, done) {
User.findOne({ userEmail: req.body.userEmail }, function(err, user) {
if (!user) {
return res.json({status:false, message:'E-Mail not Found'})
}
console.log('step 1')
user.reset_password_token = token;
user.reset_password_expaire = Date.now() + 3600000; // 1 hour
user.save(function(err) {
done(err,token, user);
});
});
},
function(token, user, done) {
console.log('step 2')
var smtpTrans = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: 'myemail',
pass: 'mypass'
}
});
console.log('step 3')
smtpTrans.sendMail({
from: 'myemail',
to:user.userEmail,
subject:'Password Reset',
text:'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n' +
'Please click on the following link, or paste this into your browser to complete the process:\n\n' +
'http://' + req.headers.host + '/api/reset_password/' + token + '\n\n' +
'If you did not request this, please ignore this email and your password will remain unchanged.\n',
});
console.log('Email Send');
}
], function(err) {
console.log('this err' + ' ' + err)
});
};
Reset Password
exports.reset_password= function(req, res,next) {
console.log('Step 1');
User.findOne({
reset_password_token: req.body.token,
reset_password_expires: {$gt: Date.now()}
})
.exec(function(err, user) {
console.log ('step 2')
if (!err && user) {
if (req.body.userPassword === req.body.userConfPassword) {
user.hash_password = bcrypt.hash(req.body.newPassword, 10);
user.reset_password_token = undefined;
user.reset_password_expires = undefined;
user.save(function(err) {
if (err) {
return res.status(422).send({
message: err
});
} else {
var data = {
to: user.userEmail,
from: 'myemail',
subject: 'Password Reset Confirmation',
text: 'Hello,\n\n' +
' - This is a confirmation that the password for your account ' + user.userEmail + ' has just been changed.\n',
};
smtpTransport.sendMail(data, function(err) {
if (!err) {
return res.json({ message: 'Password reset' });
} else {
return done(err);
}
});
}
});
} else {
return res.status(422).send({
message: 'Passwords do not match'
});
}
} else {
return res.status(400).send({
message: 'Password reset token is invalid or has expired.'
});
}
});
};
node Routes
router.post('/forgot_password',forgot_password_Ctrl.forgot_password)
router.get('/reset_password/:token',reset_password_ctrl.reset_password)
Angular ROute
forgotpassword(value) {
return this.http.post(`${this.uri}/forgot_password`, value);
}
resetpassword(token) {
return this.http.post(`${this.uri}/reset_password/${token}`, token);
}
Schema
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const User = new Schema({
userName: String,
userEmail: String,
userPassword: {type: String,required: true, bcrypt: true},
userConfPassword: String,
userPhone: Number,
userExperience: String,
reset_password_token: String,
reset_password_expaire: Date,
new_user: String
});
const user = mongoose.model("user", User); //"user" is collections
module.exports= user;