NodeJs和nodemailer - 隐藏Email-Link和URL中的查询参数?

时间:2017-06-28 09:29:41

标签: javascript node.js mongodb

如何在向具有链接的用户发送电子邮件时隐藏URL中的查询字符串参数,并且能够在浏览器中加载页面时同时读取它们?

使用:NodeJs,Angular1,MongoDb。

代码:

exports.newPass = function (req, res) {
User.findOne({
    email: req.body.email
}, function (err, email) {
    console.log('Email: ' + email);
    if (err) throw err;
    if (!email) {
        console.log('Email: ' + email);
        return res.json({ message: 'This Email does not exist!' });

    }

    var transport = mailer.createTransport({
        host:'localhost',
        port: 25,
        secure: false,
        auth: {
            user: "userName",
            pass: "passWord"
        }
    });

    var mail = {
        from: "DevOps <dev@localhost>",
        to: "dev@localhost",
        subject: "Set New Password",
        text: "To set new Password: ",
        html: '<strong>To set new Password: </strong>'
            + ' <a href="http://localhost:4000/endPoint#!/signup?m='
            + email.email
            + '&fn='
            + email.fullName
            + '&_id='
            + email._id
            + '">Restore Password</a>'
    }

    transport.sendMail(mail, function(error, response){
        if(error){
            console.log( 'Server Error: ' + error );
        }else{
            console.log( 'Message sent: ' + JSON.stringify(response.messageId) );
        }
        transport.close();
    });
    return res.json({ Ok: 'New Password will be send to you... please check your Emails' });
});
};

我可以通过添加以下内容在Angular Controller中管理它:

$location.search({});

但参数和值仍在电子邮件链接中可见。 用户点击电子邮件链接并进入浏览器后,它们会消失。 我想在发送给收件人的电子邮件中隐藏它们。

1 个答案:

答案 0 :(得分:1)

如果不考虑安全性,可以使用所需的数据创建一个对象,对其进行字符串化,然后在base 64中对其进行编码。您可以轻松地将其解码回JSON字符串。

你可以在Node中做这样的事情:

var data = { email: email.email, fn: email.fullName, _id: email._id };
data = JSON.stringify(data);
data = Buffer.from(data).toString('base64');
var mail = {
        from: "DevOps <dev@localhost>",
        to: "dev@localhost",
        subject: "Set New Password",
        text: "To set new Password: ",
        html: '<strong>To set new Password: </strong>'
            + ' <a href="http://localhost:4000/endPoint#!/signup?d=' + data + '">Restore Password</a>'
    }

请注意,任何人都可以对此进行解码。

根据您想要获取此数据的位置,您必须检查如何解码此数据的不同方法。它在Node中非常相似:

Buffer.from(b64string, 'base64');

但是,如果您不希望人们能够对此进行解码,那么您必须采取不同的方法。 我要做的是生成一个随机哈希,并将其存储在某个地方的数据库中,表明它已连接到某个想要更改密码的用户。然后,您可以将该哈希发送给用户,并在请求发送的URL时查找。