如何在创build用户之前validation电子邮件?

情况:

我正尝试将validation电子邮件发送给刚刚注册的用户。

除非他validation他的电子邮件地址,否则他的帐户不会被创build。


我的代码:

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因为用户还没有被创build。 这意味着我的代码崩溃。


题:

我怎样才能达到我所期望的?

或者,还有更好的方法 ?


参考

https://firebase.google.com/docs/auth/web/manage-users

把我的意见收集到一个答案,因为它似乎已经回答你的问题给你。

为了能够处理确认请求,您必须存储与待处理用户相关的内容。 您可以创build一个用户对象,并将其置于“挂起”状态,以使您的代码不会用于除确认之外的任何操作,也可以创build单独的对象types(挂起的确认对象),直到确认发生。 您不希望现有的请求处理程序“等待”,直到确认发生。

您目前的scheme允许攻击者用请求加载服务器,等待发生的事情,这可能会耗尽您的内存或套接字。 实际上,在数据库中存储一个小对象要好得多,如果这些对象没有被确认,那么每隔几个小时就可以清理一次。 而且,很可能一些善意的用户在60秒内甚至无法进行确认,就像你编码一样,只会让一些合法的用户感到沮丧。

你必须存储一些东西。 当一个确认链接进来时,你必须有一些东西来比较它以前存储的。 否则,人们可以自己编写确认链接,然后很乐意地处理它们。 存储您在原始请求时创build的内容是当请求到达您的服务器时如何validation确认链接,以及如何将其与正确的用户对象相关联。 我不明白什么是反对将数据库中的一个小的(可能在100字节)帐户挂起的对象存储?