如何正确地进行用户注册的电子邮件验证?

时间:2017-01-12 23:30:13

标签: javascript node.js firebase firebase-authentication

我想要实现的目标:

当我的用户注册时,我想要发送确认电子邮件。

在确认他的电子邮件地址之前,他无法登录。

他有5分钟的时间。

如果没有及时完成,他的帐户将被删除,他需要再次注册。

我的当前代码:

firebase.auth().createUserWithEmailAndPassword(email, password).then(userData => { 

                var user = {
                    email: email,
                    username: username,
                }

                firebase.database().ref('users/'+userData.uid.toString()).set(user);

                var userAuth = firebase.auth().currentUser;


                userAuth.sendEmailVerification().then(function() {

                          req.flash('success_msg', 'You have 5 minutes to confirm your email address. Check your inbox !');
                          res.redirect('...');
                })


                }, function(error) {
                    console.log(error);
                });

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

问题:

如何实现以下目标:

1)在确认电子邮件之前阻止用户登录

这就是我的尝试:

firebase.auth().signInWithEmailAndPassword(email, password).then(authData => { 

            firebase.auth().onAuthStateChanged(function(user) { 
                if (user.emailVerified) {
                    req.flash('success_msg', 'You have logged in');
                    res.redirect("...");
                }
                else {
                    firebase.auth().signOut().then(function() {
                        req.flash('error_msg', 'Please confirm your email address');
                        res.redirect("/");
                    }, function(error) {

                    });
                }
            });

        })

2)5分钟后删除他的帐户,除非他确认了他的电子邮件地址。

我看到了这个:Delete firebase data older than 2 hours

但是,我应该将删除未经证实的用户的代码放在哪里超过5分钟?

在我的app.js

2 个答案:

答案 0 :(得分:1)

我的意思是有不同的方式,但我采取的方法是;

帐户有效'数据库中的boolean,在创建帐户时默认为false。确认帐户后,将其设置为true。检查登录以查看此布尔值,如果为false,则无法登录。很简单!

帐号过期并在5分钟后删除。我通常会创建字段'帐户创建'并且'帐户已更新'存储在数据库中的用户。然后,您可以拥有一个每分钟运行一次的cron作业/计划任务,运行查询,如下所示。

'如果active = false且帐户创建> 5分钟,删除行'。 (显然是用你选择的查询语言。)

答案 1 :(得分:1)

我不知道你正在使用的firebase代码,但是你可以在第一次创建它时在用户对象上设置一个属性,表明它们尚未确认。如果您的数据库尚未执行此操作,您还可以在对象上设置timestamp属性,以便了解它何时创建。

然后,每当您检查用户身份验证时,您检查该标志是否已设置,那么您登录失败?当他们确认时,你清除旗帜。

然后,要清除旧的未经证实的用户对象,可以在服务器首次启动时运行的代码中输入类似的内容:

// run user object cleanup once an hour
setInterval(function() {
     // query database for all user objects with unconfirmed flag set
     // remove any objects that have a timestamp older than 5 mins from now
}, 1000 * 60 * 60);

如果您使用express,那么您的启动文件通常称为app.jsserver.js,您可以在此处插入此代码。如果您有一个单独的模块来初始化数据库,您也可以将其作为该文件中的最后一步放在该文件中。