如何在向具有链接的用户发送电子邮件时隐藏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({});
但参数和值仍在电子邮件链接中可见。 用户点击电子邮件链接并进入浏览器后,它们会消失。 我想在发送给收件人的电子邮件中隐藏它们。
答案 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时查找。