首页 > 解决方案 > 如何使用 node.js 设置重置密码功能?

问题描述

请帮助我编写忘记密码的逻辑。我已经测试了我使用 Postman 的东西,但它不起作用。我使用 nodemailer 作为邮件服务器引擎。整个项目是使用 Angular 4/5 连接的(建议的解决方案应该考虑这个因素)。请帮助检查并提供建议/更正。谢谢。

这是到目前为止的代码 -

//忘记密码

const transport  = require('nodemailer-smtp-transport');
app.get('/forgotPassword', function(req, res){

    });
app.post('/forgotPassword', function(req, res, next){
    async.waterfall([
        function(done) {
            crypto.randomBytes(20, function(err, buf) {
                const token = buf.toString('hex');
                done(err, token);
            });
        },
        function(token, done) {
            user.findOne({email: req.body.email }, function(err, user, req) {
                if (!user){
                    console.log ('No account with that email address exists.');

                }
                user.resetPasswordToken = token;
                user.resetPasswordExpires = Date.now() + 3600000; //1 hour

            });
        },
        function(token, user, done){
            const smtpTransporter = nodemailer.createTransport({
                service: 'Gmail',
                auth: {
                    user: 'preciousegunjobi@gmail.com',
                    pass: 'Presidoe2011!'
                }
            });

            const mailOptions = {
                from: 'preciousegunjobi1@gmail.com', //sender
                to: req.body.email, 
                subject: 'Password Reset Notification',
                html: '<h3>You are receiving this because you (or someone else) have requested the reset of the password on your account. ' + '\n' + ' Please click on the following link, or paste into your browser to complete the password reset process. </h3>' +' \n '+ 'http://' + req.headers.host + '/reset/' + token + '\n\n' +
                       '<h4> If you did not request this, please ignore this email and your password will remain unchanged </h4>'
            }; 

            smtpTransporter.sendMail(mailOptions, function(err, req){
                console.log('mail sent');
                console.log ('success', 'An e-mail has been sent to ' + user.email + 'with further instructions to reset password.');
                done(err, 'done');
            });

        }
    ], function(err){
        if (err) return next(err);

    });
});
app.get ('/reset/:token', function(req, res){
    user.findOne({ resetPasswordToken: req.params.token, resetPasswordExpires: {$gt: Date.now() } }, function(err, user, req){
        if (!user){
            console.log ('error', 'Password reset token is invalid or has expired.');

        }
       // if(req.body.password === req.body.confirm) {
           // user.setPassword(req.body.password, function(err, token) {
                user.password = req.body.password;
                user.resetPasswordToken = undefined;
                user.resetPasswordExpires = undefined;
                console.log('password' + user.password + 'and the user is' + user)

              //  )

            })
       // } else {
            //console.log ("error", "Passwords do not match.");

       // }
// });
},
function(user, done) {
   const smtpTransporter = nodemailer.createTransport({
       service: 'Gmail',
       auth: {
           user: 'preciousegunjobi1@gmail.com',
           pass: 'Presidoe2011!'
       }
   });
   const mailOptions = {
       to: user.email,
       from: 'preciousegunjobi1@gmail.com',
       subject: 'Your password has been changed',
       text: 'Hello, \n\n' +
        'This is a confirmation that the password for your account ' + user.email + ' has just been changed.'
   };
   smtpTransporter.sendMail(mailOptions, function(err, req) {
       console.log ('success', 'Success! Your password has been changed.');
       done(err);
   });
});

//end of forgot password logic

标签: node.js

解决方案


推荐阅读