如何在 Angularfire 中进行级联删除?

How to do a cascading remove in Angularfire?

如何在 Firebase 中以最佳方式删除用户和 his/her 配置文件(配置文件有自己的节点,以 $uid 作为键)?

我应该先对配置文件执行 $remove(),然后再执行 $userRemove(),还是有更好的方法?如果我的规则设置正确,我猜想在删除用户后我将无法访问要删除的配置文件,因为只有用户对配置文件具有写入权限。

"profiles": {
  "$uid": {
    // grants write access to the owner of this profile whose uid must exactly match the key ($uid)
    ".write": "auth !== null && auth.uid === $uid",
    // grants read access to any user who is logged in with an email and password
    ".read": "auth !== null && auth.provider === 'password'"
  }
}

这就是我认为可以完成的方式,但是如果其中一个调用通过而不是另一个调用会发生什么情况,那么它就是不一致的 user/profile。

var firebaseObj = new Firebase(FBURL),
    Auth = $firebaseAuth(firebaseObj);

var profileObj = $firebase(firebaseObj.child('profiles').child(user.uid)).$asObject();

profileObj.$remove().then(function(data) {
    return Auth.$removeUser(user);
}).then(function(data) {
    console.log('successfully removed user and profile');
});

注意:我没有测试上面的代码,只是想了解其他人对如何做到这一点的想法,并提供一个粗略的例子来说明我是如何做到的。

删除用户不会使授权令牌失效,也不会从帐户中注销用户。这是对 OAuth 令牌的一个常见误解——认为令牌是某种实时、活动的组件,不断监视服务器的变化。 OAuth 令牌在被撤销之前一直有效。

在 Firebase 中,OAuth 令牌在以下情况下被撤销:

  • 用于创建它的秘密已被撤销
  • 令牌过期

也可以通过 adding a dependency in the data which is checked in security rules有效地 撤销访问权限。这样,即使现有令牌仍然有效,也可以阻止对数据的访问。

因此这里的顺序无关紧要。您可以同时删除帐户和删除记录,而不必担心用户会以某种方式失去访问权限。

此外,这不是级联删除,因为一个操作是删除用户凭据(这是 email/pass -> uid 的加密哈希),另一个是从 Firebase 中物理删除数据--这些操作是完全独立的,除了您对应用程序的数据施加的限制外,完全不相关。