在我的应用程序中,任何用户(通过 Firebase 简单登录注册)一次可以拥有 3 种可能状态中的 1 种,即active
和deleted
中的一种suspended
。我保持这样:
"users": {
"simplelogin:1": {
"username": "user1",
"email": "user1@example.com",
"status": "active"
},
// ...
}
任何涉及任何用户的活动都将检查他/她的状态,如果是,deleted
或者suspended
该操作无法完成。
通常当用户选择从我的应用程序中删除他的帐户时,它会是这样的:
var ref = new Firebase("https://my-app.firebaseio.com");
ref.child('users/simplelogin:1/status').set('deleted', function (error) {
if (!error) {
ref.removeUser({
email: "user1@example.com",
password: "secretpassword"
});
}
});
问题是用户可以删除他/她的帐户而无需status
先更新deleted
。例如,这可以由用户在自己的浏览器控制台或 Node.js 上完成:
var ref = new Firebase("https://my-app.firebaseio.com");
ref.removeUser({
email: "user1@example.com",
password: "secretpassword"
});
这样,用户将不会在 Firebase 上拥有他的帐户,但status
我在上面保留的该用户的帐户将保留active
,因此我的应用程序将允许该用户的任何活动(例如有人向他发送礼物,如果他status
已deleted
正确更新。)这可能是一个问题。当用户删除他/她的帐户时,status
如何更新?deleted
我想到的解决方案是定期运行cron作业检查Firebase中的所有用户,尝试使用随机密码注册没有状态deleted
的用户并检查是否收到EMAIL_TAKEN
错误。如果可以注册,则意味着用户已经删除了他/她的帐户,但status
Firebase 中的帐户尚未更新为deleted
. 在这种情况下,它必须将状态更新为某些东西(例如suspicious
或deleted
)并再次删除这个新注册的帐户。我认为这可能是这样实现的:
// Assume this ref authenticated with admin privilege.
ref.child('users').on('child_added', function (snap) {
var user = snap.val();
if (user.status !== 'deleted') {
// Assume _generateRandomPassword gives generated random password.
var password = _generateRandomPassword();
var credentials = {
email: user.email,
password: password
};
ref.createUser(credentials, function (error) {
if (!error) {
snap.ref().child('status').set('deleted');
ref.removeUser(credentials);
}
});
}
});
我认为这可能不是一个好的解决方案,因为系统必须为每个用户(没有deleted
状态)运行,例如每晚。这个问题有更好的解决方案吗?