【问题标题】:How to verify email before creating user?如何在创建用户之前验证电子邮件?
【发布时间】: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,因为尚未创建用户。这意味着我的代码崩溃了。


问题:

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

或者有没有更好的方法?


参考

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

【问题讨论】:

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

标签: javascript node.js firebase firebase-authentication


【解决方案1】:

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

为了能够在收到确认请求时对其进行处理,您必须存储与待处理用户相关的内容。您要么创建一个用户对象并将其置于“待处理”状态,即您的代码不会被用于确认以外的任何事情,或者您创建一个单独类型的对象(待处理的确认对象),直到确认发生。您不希望现有的请求处理程序“等待”直到确认发生。

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

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

【讨论】:

  • 你是个传奇!谢谢 :) 像你这样的人太棒了!
猜你喜欢
  • 2019-02-13
  • 2021-09-22
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
相关资源
最近更新 更多