【发布时间】:2017-01-12 21:15:46
【问题描述】:
情况:
我正在尝试向刚注册的用户发送验证电子邮件。
除非他验证他的电子邮件地址,否则不会创建他的帐户。
我的密码:
var userAuth = firebase.auth().currentUser;
userAuth.sendEmailVerification().then(function() {
req.flash('success_msg', 'Please verify your email address. You have 60 seconds');
setTimeout(function(){
if(userAuth.emailVerified) {
firebase.auth().createUserWithEmailAndPassword(email, password).then(userData => {
var user = {
email: email,
username: username,
}
firebase.database().ref('users/'+userData.uid.toString()).set(user);
req.flash('success_msg', 'You have registered and logged in.');
res.redirect('...');
}).catch(error => {
var errorCode = error.code;
var errorMessage = error.message;
req.flash('error_msg', 'Registration Failed. ' + error.message);
res.redirect('/users/register');
console.log("Error creating user: ", error);
});
} else {
req.flash('error_msg', 'Registration Failed.');
res.redirect('/users/register');
}
}, 60000);
}, function(error) {
console.log(error);
});
问题:
userAuth 当然是null,因为尚未创建用户。这意味着我的代码崩溃了。
问题:
我怎样才能实现我想要的?
或者有没有更好的方法?
参考
【问题讨论】:
-
为了能够处理确认,您必须存储与待处理用户相关的内容。您要么创建一个用户对象并将其置于“待处理”状态,即您的代码不会被用于确认以外的任何事情,或者您创建一个单独类型的对象(待处理的确认对象),直到确认发生。您不希望现有的请求处理程序“等待”直到确认发生。
-
而且,您当前的方案只给您的用户 60 秒的时间进行确认。一些电子邮件系统/客户端甚至不会在那么长的时间内向最终用户提供电子邮件。您需要一个设计,可以在接下来的几秒内或从现在起的几十分钟内随时完成确认。电子邮件确认链接可以将最终用户带到注册过程的下一步。
-
@jfriend00 我理解你的理由。但是如果我创建一个待处理的对象,这意味着任何人都可以开始向我的数据库发送无用数据的垃圾邮件。我已经计划了 10 分钟的计时器和 IP 限制,但我知道这些可以被足够熟练的黑客绕过。我想要一种方法,除非从有效的电子邮件地址确认,否则根本不会写入任何数据。这样,攻击变得更加难以执行。有没有办法做到这一点,还是我只是梦想着一个不存在的解决方案?
-
好吧,您当前的方案允许攻击者通过请求加载您的服务器,只是等待某些事情发生,这可能会耗尽您的内存或套接字。实际上,在数据库中存储一个小对象要好得多,如果它们没有得到确认,您可以每隔几个小时左右清理一次。而且,一些好心的用户可能甚至无法像您编写的代码那样在 60 秒内完成确认,因此您只会让一些合法用户感到沮丧。
-
您正在追求一个糟糕的设计,以保护自己免受首先不是很大威胁的东西以及您可以通过其他方式保护自己免受威胁的东西。给您的设计带来风险。
标签: javascript node.js firebase firebase-authentication