首页 文章

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

提问于
浏览
12

Under The Hood

我在我的Android应用中使用 Firebase Authentication 使用Google,Facebook和电子邮件/密码注册用户 . 到目前为止,除了单个场景之外,几乎所有内容都能正常工

The Scenario

我需要来自Firebase控制台的 disabledelete 用户帐户有时禁止我的应用程序的某些用户 .

在这种情况下,当我禁用或删除该特定用户时,用户必须获得 logged out from the app instantly ,并且不能再使用它 .

The Bug

我已经使用 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 回答

  • 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()"
        }
      }
    }
    

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

相关问题