在我的应用中,任何用户(通过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
错误。如果它可以注册,则表示用户已经删除了他/她的帐户,但Firebase中的status
未更新为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
状态)运行,例如每天晚上。这个问题有更好的解决方案吗?