1

在我的应用程序中,任何用户(通过 Firebase 简单登录注册)一次可以拥有 3 种可能状态中的 1 种,即activedeleted中的一种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,因此我的应用程序将允许该用户的任何活动(例如有人向他发送礼物,如果他statusdeleted正确更新。)这可能是一个问题。当用户删除他/她的帐户时,status如何更新?deleted

我想到的解决方案是定期运行cron作业检查Firebase中的所有用户,尝试使用随机密码注册没有状态deleted的用户并检查是否收到EMAIL_TAKEN错误。如果可以注册,则意味着用户已经删除了他/她的帐户,但statusFirebase 中的帐户尚未更新为deleted. 在这种情况下,它必须将状态更新为某些东西(例如suspiciousdeleted)并再次删除这个新注册的帐户。我认为这可能是这样实现的:

// 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状态)运行,例如每晚。这个问题有更好的解决方案吗?

4

0 回答 0