禁用或删除用户时,Firebase身份验证状态更改不会触发

时间:2016-07-13 07:20:47

标签: android firebase firebase-authentication

Under The Hood

我在Android应用中使用 Firebase身份验证,使用Google,Facebook和电子邮件/密码注册用户。到目前为止,几乎所有事情都可以正常工作,除了一个场景。

情景

我需要从Firebase控制台禁用删除用户帐户,有时会禁止我的应用的某些用户。

在这种情况下,当我禁用或删除该特定用户时,用户必须立即从应用中退出,并且无法再使用它。

错误

我已使用AuthStateListener侦听身份验证状态更改,并在帐户被禁用或删除后自动注销用户。

FirebaseAuth.getInstance().addAuthStateListener(firebaseAuth -> {
            if (firebaseAuth.getCurrentUser() == null) {
                Intent intent = AuthFlowActivity.getCallingIntent(AuthFlowActivity.FORCE_LOGOUT);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                startActivity(intent);
                activityExitAnimation(BaseAppActivity.this);
            }
        });

但我从未见过AuthStateListener触发这些操作的任何事件。所以我无法立即注销用户,用户仍然可以继续使用该应用程序。

如果有人可以帮助解决这个问题,我将不胜感激。

1 个答案:

答案 0 :(得分:16)

禁用或删除用户帐户不会触发身份验证状态更改。也不应该,用户仍然是经过身份验证的。在最多一个小时内,Firebase身份验证将尝试刷新用户的访问令牌。刷新将失败,此时用户将变为未经身份验证,并且将激活身份验证状态更改事件。

如果您希望立即撤消用户的授权,则必须在应用程序逻辑的其他部分执行此操作。一种常见的方法是在应用程序中使用黑名单,例如:在Firebase Database

/bannedUsers
    uidOfBannedUser: true

现在,当您在Autentication面板中删除/禁用用户帐户时,您还需要将他们的uid添加到数据库中禁止用户的列表中。

然后,通过向database security rules添加一个条款,可以保护数据库免受未授权用户的访问,例如

{
  "rules": {
    "bannedUsers": {
      ".read": true,
      ".write": false // only admins can write these
    },
    "messages": {
      ".read": "auth != null && !root.child('bannedUsers').child(auth.uid).exists()"
    }
  }
}

如果使用不同的后端,则实现方式会有所不同。但像这样的黑名单是禁止用户的常用方法。您会发现您甚至可能对他们只禁止他们的身份验证关注不够,而不是删除他们的凭据(他们可以简单地重新创建)。