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

Javascript 如何在创建用户之前验证电子邮件?,javascript,node.js,firebase,firebase-authentication,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(){

情况:

 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);
        });   
我正在尝试向刚注册的用户发送验证电子邮件

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


我的代码:

 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);
        });   

问题:

 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
,因为用户尚未创建。这意味着我的代码崩溃了


问题:

 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);
        });   
我如何才能实现我所追求的目标

还是有更好的办法


参考


将我收集的评论整理成一个答案,因为它似乎已经为您回答了您的问题


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

您当前的方案允许攻击者在服务器上加载请求,只是等待可能耗尽内存或套接字的事件发生。事实上,最好在数据库中存储一个小对象,如果它们没有被确认的话,你可以每隔几个小时左右清理一次。而且,很可能一些善意的用户甚至不能像您编码的那样在60秒内完成确认,因此您只会挫败一些合法用户


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

为了能够处理确认,您必须存储与挂起用户相关的内容。您可以创建一个用户对象并将其置于“挂起”状态,即您的代码不允许用于除确认之外的任何事情,或者创建一个单独类型的对象(挂起的确认对象),在确认发生之前,这就是所有存在的。您不希望您现有的请求处理程序“等待”直到确认发生。而且,您当前的方案只给您的用户60秒时间进行确认。一些电子邮件系统/客户端甚至不会在这么长的时间内向最终用户发送电子邮件。您需要一种设计,在这种设计中,确认可以在接下来的几秒钟内或几十分钟内完成。电子邮件确认链接可以将最终用户带到注册过程的下一步。@jfriend00我理解您的推理。但如果我创建了一个挂起的对象,这意味着任何人都可以开始用无用的数据滥发我的数据库。我已经计划了10分钟的计时器和IP限制,但我知道一个足够熟练的黑客可以绕过这些限制。我想一个方法,没有任何数据得到书面确认,除非从一个有效的电子邮件地址。这样,攻击变得更加难以执行。有没有办法做到这一点,或者我只是在梦想一个不存在的解决方案?好吧,您当前的方案允许攻击者在服务器上加载请求,只是等待可能耗尽内存或套接字的事件发生。事实上,最好在数据库中存储一个小对象,如果它们没有被确认的话,你可以每隔几个小时左右清理一次。以及,很可能一些善意的用户甚至不能像你编码的那样在60秒内完成确认,因此你只会挫败一些合法用户。你追求的是一个糟糕的设计,目的是为了保护自己不受一开始不是什么威胁的东西的影响,而你可以通过其他方式保护自己这将大大降低您的设计风险。您是一个传奇!谢谢:)像你这样的人真了不起!