Firebase简单登录-当用户删除其帐户时,我可以观看事件吗?

Firebase简单登录-当用户删除其帐户时,我可以观看事件吗?,firebase,firebase-authentication,Firebase,Firebase Authentication,在我的应用程序中,任何用户(通过Firebase简单登录注册)一次可以有三种状态中的一种,即活动状态、删除状态和暂停状态。我是这样保存的: "users": { "simplelogin:1": { "username": "user1", "email": "user1@example.com", "status": "active" }, // ... } var ref = new Firebase("https://my-app.firebaseio

在我的应用程序中,任何用户(通过Firebase简单登录注册)一次可以有三种状态中的一种,即
活动状态
删除状态
暂停状态
。我是这样保存的:

"users": {
  "simplelogin:1": {
    "username": "user1",
    "email": "user1@example.com",
    "status": "active"
  },
  // ...
}
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"
    });
  }
});
// 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);
      }
    });
  }
});
涉及任何用户的任何活动都将检查其状态,如果
已删除
已暂停
则无法执行该操作

通常,当用户选择从我的应用程序中删除其帐户时,情况如下:

"users": {
  "simplelogin:1": {
    "username": "user1",
    "email": "user1@example.com",
    "status": "active"
  },
  // ...
}
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"
    });
  }
});
// 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);
      }
    });
  }
});
问题是用户可以删除他/她的帐户,而无需先将
状态
更新为
已删除
。例如,这可以由用户在自己的浏览器控制台或Node.js上完成:

var ref = new Firebase("https://my-app.firebaseio.com");

ref.removeUser({
   email: "user1@example.com",
   password: "secretpassword"
});
这样,用户将不会在Firebase上拥有他的帐户,但我在上面保留的该用户的
状态将保持
活动状态,因此我的应用程序将允许该用户进行任何活动(例如有人向他发送礼物,如果他的
状态更新为
已正确删除
,则不允许这样做。)这可能是个问题。当用户删除其帐户时,如何将
状态
更新为
已删除

我想到的解决方案是定期运行cron job来检查Firebase中的所有用户,尝试使用随机密码注册没有状态
deleted
的用户,并检查接收
电子邮件是否出错。如果可以注册,则表示用户已删除其帐户,但Firebase中的
状态
尚未更新为
已删除
。在这种情况下,它必须将状态更新为某些内容(例如
可疑
已删除
),并再次删除此新注册的帐户。我认为可以这样实施:

"users": {
  "simplelogin:1": {
    "username": "user1",
    "email": "user1@example.com",
    "status": "active"
  },
  // ...
}
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"
    });
  }
});
// 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
状态),例如每天晚上。这个问题有更好的解决办法吗?

有趣的问题。但您描述了应用程序的许多细节,而我们对此并不了解。你能提供一个答案吗?谢谢你@FrankvanPuffelen,我试图改进我的问题。这个更好吗?如果不是,我会再试一次:)谢谢。这肯定有帮助。但我仍然不清楚这个问题。用户如何在不更新状态的情况下删除其帐户?显示执行此操作的代码。为什么cron作业不是一个好的解决方案?显示它的代码,并说明它不起作用/错误的原因。请阅读我链接到的mcve页面。我知道这是一个漫长的阅读和大量的工作。但如果没有这项工作,您的问题可能仍然没有答案,因为它太宽泛了。请重试。对不起,我的解释技巧。如果还不清楚,我会再次努力。谢谢你的评论。谢谢,这很有帮助!我现在清楚了您的用例。但我认为我没有真正的解决办法。用户应该能够删除他们的帐户,(不幸的是)您没有收到此通知。您的服务器端检查听起来似乎可以工作,但会很昂贵。您还可以按需检查:当用户尝试与某人交互时,检查某人帐户是否存在(使用“尝试创建”方法)。或者:您可以将交互更改为收件人必须接受的模型吗?我想这会解决它。有趣的问题。但您描述了应用程序的许多细节,而我们对此并不了解。你能提供一个答案吗?谢谢你@FrankvanPuffelen,我试图改进我的问题。这个更好吗?如果不是,我会再试一次:)谢谢。这肯定有帮助。但我仍然不清楚这个问题。用户如何在不更新状态的情况下删除其帐户?显示执行此操作的代码。为什么cron作业不是一个好的解决方案?显示它的代码,并说明它不起作用/错误的原因。请阅读我链接到的mcve页面。我知道这是一个漫长的阅读和大量的工作。但如果没有这项工作,您的问题可能仍然没有答案,因为它太宽泛了。请重试。对不起,我的解释技巧。如果还不清楚,我会再次努力。谢谢你的评论。谢谢,这很有帮助!我现在清楚了您的用例。但我认为我没有真正的解决办法。用户应该能够删除他们的帐户,(不幸的是)您没有收到此通知。您的服务器端检查听起来似乎可以工作,但会很昂贵。您还可以按需检查:当用户尝试与某人交互时,检查某人帐户是否存在(使用“尝试创建”方法)。或者:您可以将交互更改为收件人必须接受的模型吗?我想那会解决它。