状况:
我正在尝试向刚刚注册的用户发送验证电子邮件。
除非他验证了自己的电子邮件地址,否则不会创建他的帐户。
我的代码:
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
,因为还没有创建用户。这意味着我的代码崩溃了。
问题:
我如何实现我的目标?
或者有更好的方法吗?
参考
答案 0 :(得分:1)
将我的评论集合放入答案,因为它似乎已经为您回答了问题。
为了能够在确认请求进入时处理确认请求,您必须存储与待处理用户相关的内容。您要么创建一个用户对象并将其置于“挂起”状态,以致您的代码不会被用于除确认之外的任何其他内容,或者您创建一个单独类型的对象(一个待处理的确认对象),直到该状态为止确认发生了。在确认发生之前,您不希望现有的请求处理程序“等待”。
您当前的方案允许攻击者在等待发生某些事情的请求时加载您的服务器,这可能会耗尽您的内存或套接字。在数据库中存储一个微小的对象实际上要好得多,如果没有得到确认,你可以每隔几个小时清理一次。并且,一些好心的用户可能甚至不能像你编码那样在60秒内完成确认,所以你只会让一些合法用户感到沮丧。
你必须存储一些东西。当出现确认链接时,您必须要将其与之前存储的内容进行比较。否则,人们可以自己组成确认链接,您可以愉快地处理它们。存储您在原始请求时创建的内容是在请求到达服务器时验证确认链接的方式,以及如何将其与正确的用户对象关联。我不明白在数据库中存储一个小的(可能不到100个字节)帐户挂起对象的异议是什么?