我想要实现的目标:
当我的用户注册时,我想要发送确认电子邮件。
在确认他的电子邮件地址之前,他无法登录。
他有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
?
答案 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.js
或server.js
,您可以在此处插入此代码。如果您有一个单独的模块来初始化数据库,您也可以将其作为该文件中的最后一步放在该文件中。