Я работаю в Node / ExpressJs. Я пытаюсь получить форму для сброса пароля:
1) Отправить электронное письмо с уникальной ссылкой, которая вернет пользователя на страницу сброса пароля (работает)
Но чтоЯ застрял на это:
2) На странице сброса мне нужно:
a) Проверьте, являются ли оба пароля одинаковыми.
b) Если они не совпадают, выведите всплывающее уведомление и попросите их еще раз ввести новый пароль.
c) Если пароли верны, отправьте их обратно на страницу входа и отправьте электронное письмо, подтверждающее успешное изменение, и попросите всплывающее уведомление (req.flash) сообщить, что оно было успешно изменено.
Пока чтоЧто работает, так это то, что он перейдет на страницу забытого пароля и отправит электронное письмо пользователю, а затем отправит его обратно по ссылке токена в emIL, и они могут ввести свой пароль на странице сброса пароля, и на MongoDb он покажет, что пароль изменен, НО это будетне отправить успешное письмо или всплывающее уведомление (req.flash).
У меня написан код, но, очевидно, я помещаю его не в то место, или я получаю ошибки, что я что-то не объявляю, и иногда он говорит «недопустимые аргументы» или не может деструктурировать код. Вещи в том же духе. Я написал все остальное до этого момента довольно хорошо, и все это работает, это просто вещь, которая ставит меня в тупик последние два дня.
Любая помощь была бы великолепна, мне просто нужно знать, где я иду не так, и любое полезное объяснение было бы фантастическим! Код, который я прокомментировал, - это то, что доставляет мне неприятности.
Вот код:
// Forgot Password
// Will send email on confirmation of valid User
router.get('/forgot', (req, res) => {
res.render('forgot')
});
router.post('/forgot', (req,res) => {
crypto.randomBytes(32, (err, buffer) => {
if(err) {
console.log(err);
return res.redirect('/users/forgot');
}
const token = buffer.toString('hex');
User.findOne({ email: req.body.email })
.then(user => {
if(!user) {
req.flash('error_msg', 'No Account with that Email');
return res.redirect('/users/forgot');
}
user.resetToken = token;
user.resetTokenExpiration = Date.now() + 3600000;
return user.save();
})
.then(result => {
req.flash('success_msg', 'Please check Email');
res.redirect('/users/login');
transporter.sendMail({
to: req.body.email,
from: 'info@freightmule.com',
subject: 'Password Reset Request',
html: `
<h1>You requested a Password Reset</h1>
<p>Click this <a href="http://localhost:5000/users/forgot/${token}">link</a> to set a new password.</p>
<p>If you did not request this change, please Contact us immediately!</p>
`
});
})
.catch(err => {
console.log(err);
});
});
});
// Reset Password Page
// User is redirected here from Reset Email
router.get('/forgot/:token', (req, res) => {
const token = req.params.token;
User.findOne({ resetToken: token, resetTokenExpiration: { $gt: Date.now() } })
.then(user => {
let message = req.flash('error');
if(message.length > 0) {
message = message[0];
} else {
message = null;
}
res.render('reset', {
errorMessage: message,
userId: user._id.toString(),
passwordToken: token
});
})
.catch(err => {
console.log(err);
});
});
// User enters new password
// Checks if passwords match then sends email & notification of success & goes back to login page
router.post('/reset', (req, res) => {
const newPassword = req.body.password;
const userId = req.body.userId;
const passwordToken = req.body.passwordToken;
let resetUser;
let errors = [];
// // Check required fields
// if(!newPassword || !newPassword2) {
// errors.push({ msg: 'Please fill in all fields' });
// }
//
// // Check Passwords match
// if(newPassword !== newPassword2) {
// errors.push({ msg: 'Passwords do not match'})
// }
//
// // Check Password length
// if(password.length < 8) {
// errors.push({ msg: 'Password needs to be at least 8 characters' })
// }
User.findOne({
resetToken: passwordToken,
resetTokenExpiration: { $gt: Date.now() },
_id: userId
})
.then(user => {
resetUser = user;
return bcrypt.hash(newPassword, 12);
})
.then(hashedPassword => {
resetUser.password = hashedPassword;
resetUser.resetToken = null;
resetUser.resetTokenExpiration = undefined;
return resetUser.save();
})
.then(result => {
req.flash('Password Changed Successful, Please Login')
res.redirect('/users/login');
})
.catch(err => {
console.log(err);
});
});
// transporter.sendMail({
// to: req.body.email,
// from: 'info@freightmule.com',
// subject: 'Password Recently Reset',
// html: `
// <h1>You Reset Your Password Successfully!</h1>
// <p>You recently Reset Your Password</p>
// <p>Your Password is successfully changed!</p>
// <p>If you did not request this change please contact us immediately!</p>
// `
// });
Вот страница пароля для отдыха в .ejs
<% include ./partials/head %>
<div class="img-wrapper flex-center">
<div class="forms-title">
<h1>Reset Password</h1>
</div>
<% include ./partials/messages %>
<div class="reset-form forms">
<form action="/users/reset" method="POST">
<div class="form-group">
<label for="password">New Password</label>
<input
type="password"
id="password"
name="password"
class="form-control"
placeholder="New Password"
value="<%= typeof password != 'undefined' ? password : '' %>"
/>
</div>
<input type="hidden" name="userId" value="<%= userId %>">
<input type="hidden" name="passwordToken" value="<%= passwordToken %>">
<button type="submit" class="btn btn-color btn-block">
Reset Password
</button>
</form>
</div>
<p class="lead mt-4">Have An Account? <a class="login" href="/users/login">Login</a></p>
</div>
<% include ./partials/footer %>