创建用户之前如何验证电子邮件?

Cod*_*000 3 javascript node.js firebase firebase-authentication

情况:

我正在尝试向刚刚注册的用户发送验证电子邮件。

除非他验证自己的电子邮件地址,否则不会创建他的帐户。


我的代码:

 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);
        });   
Run Code Online (Sandbox Code Playgroud)

问题:

userAuth当然是null因为用户还没有创建。这意味着我的代码崩溃了。


问题:

我怎样才能实现我想要的目标?

或者,还有更好的方法 ?


参考

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

jfr*_*d00 6

将我收集的评论放入答案中,因为它似乎已经为您解答了您的问题。

为了能够在收到确认请求时对其进行处理,您必须存储与待处理用户相关的内容。您可以创建一个用户对象并将其置于“待处理”状态,这样您的代码将不允许用于除确认之外的任何用途,或者您创建一个单独类型的对象(待处理确认对象),这就是存在的全部内容,直到确认发生。您不希望现有的请求处理程序“等待”直到确认发生。

您当前的方案允许攻击者向您的服务器加载请求,只是等待发生一些事情,这可能会耗尽您的内存或套接字。实际上,最好在数据库中存储一个小对象,如果未得到确认,您可以每隔几个小时左右清理一次。而且,很可能一些善意的用户甚至无法像您编码的那样在 60 秒内完成确认,因此您只会让一些合法用户感到沮丧。

你必须存储一些东西。当确认链接出现时,您必须有一些东西可以将其与您之前存储的内容进行比较。否则,人们可以自己制作确认链接,您会很乐意处理它们。存储您在原始请求时创建的内容是您在请求到达服务器时验证确认链接的方式,也是您将其与正确的用户对象关联的方式。我不明白为什么要在数据库中存储一个小的(可能低于 100 字节)帐户挂起对象?