任何人都可以帮我解决从用户输入(电子邮件地址)创建安全令牌(或哈希)的用途。我想建立一个电子邮件验证系统进行注册。
我的问题是这个网址应该是怎样的。我想我应该通过将电子邮件地址编码到其中来使其独特,将URL保存到临时表,当用户打开链接时我会比较两者。如果匹配,我会将凭据移动到真实表格。
你对这个话题有什么好的资源吗?我在后端有nodejs。感谢
答案 0 :(得分:4)
我认为你的方法也是正确的。我在Express(REST API)中使用类似方法完成了电子邮件验证。我已经使用jsonwebtoken来编码email_id,user_id和expiry_date(用于检查在用户的注册电子邮件地址上发送的链接的有效性)。
然后将此编码数据附加到链接 示例: http://your_backend_server_link/verifyEmail/1234567890afshgdf ..
router.post('/AddUser', function(req, res, next) {
var user = new User();
user.name = req.body.name;
user.email = req.body.email;
user.is_verified = false;
user.save(function(err,user){
if(err){
console.log(err);
res.json(err);
} else{
console.log("User data saved");
var transport = mailer.createTransport({
service : "Gmail",
auth : {
user : config.central_email,
pass : config.central_email_password
}
});
// tommorow's date
var info = {};
info.user = user;
info.expiry = new Date(new Date().getTime() + 24 * 60 * 60 * 1000);
var token = jwt.encode(info,config.secret);
console.log("http://localhost:3000/verifyEmail/" + token);
var mailOptions = {
from : "TEST<noreply@vysly.com>",
to : user.email,
subject : "Welcome to TEST",
text : 'Visit this http://localhost:3000/verifyEmail/'+token,
html : '<a href="http://localhost:3000/verifyEmail/'+token+'"><H2>Click on this</H2></a>'
}
transport.sendMail(mailOptions,function(email_err,email_data){
if(email_err){
console.log(email_err);
res.json(email_err);
}else{
console.log("Email is Sent");
res.json({result : 1});
}
});
}
});
});
当用户点击此链接时,从URL获取令牌并对其进行解码。检查expiry_date,将其与服务器的当前日期进行比较,以确定链接的有效性
router.get('/verifyEmail/:token',function(req,res){
var token = req.params.token;
var data = jwt.decode(token,config.secret);
console.log(new Date(data.expiry));
console.log(new Date());
if(new Date(data.expiry) > new Date()){
User.findOne({ _id : data.user._id, name : data.user.name })
.exec(function(err,user){
if(err){
console.log(err);
res.json(err);
}else if(!user){
console.log("User not found");
res.json({error : "User not found"});
}else{
console.log("User found");
user.is_verified = true;
user.save(function(update_err,update_data){
if(update_err){
console.log(update_err);
res.json(update_err);
}else{
console.log("Email is verified of user "+update_data._id);
res.json({result : 1});
}
});
}
});
}else{
console.log("Link is expired");
res.json({error : "Link is expired"});
}
});
答案 1 :(得分:0)
为什么不使用SHA1哈希?
var crypto = require('crypto');
var uString = crypto.createHash('sha1')。update('martu1200@gmail.com')。digest('hex');
将为每个唯一的电子邮件ID生成唯一键。您可以将时间戳汇总到电子邮件中继续发送。
修改强>
如评论中所述,上述方法不安全,因为它仅使用公共信息来创建哈希。因此:
var uString = crypto.createHash('sha1')。update('martu1200 @ gmail.com'+ mySecretKey).digest('hex');
如果您的计划不是在验证过程中重新创建哈希值,那么mySecretKey可以是随机字符串。