2016-07-13 560 views
5

引擎盖下火力地堡认证状态变化不火或删除

我使用火力地堡认证在我的Android应用程序注册/使用谷歌,Facebook和电子邮件/密码的用户。到目前为止,几乎一切正常,除了一个场景。

我需要禁用删除从火力地堡控制台用户帐户有时禁止我的应用程序的一些用户的情况。

在这种情况下,当我禁用或删除该特定用户时,用户必须从应用立即注销,并且不应再能够使用它。

的错误

我已经使用了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触发这些操作的任何事件。所以我无法立即注销用户,用户仍然可以继续使用该应用程序。

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

回答

11

禁用或删除用户帐户不会触发身份验证状态更改。用户也不应该被认证。在最多一小时内,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()" 
    } 
    } 
} 

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

+0

非常感谢帮助我解决这个问题。我不清楚我应该采取哪种方法。 在同样的笔记,我想知道如果访问令牌过期,AuthStateChange侦听器是否触发?并且令牌在多长时间内过期? –

+0

短暂的访问令牌在一个小时内过期(因此我的意见是最多需要一个小时)。如果令牌无法刷新,肯定会激发身份验证状态更改。如果令牌刷新,它也可能调用方法,但我没有检查一段时间(这是一个更具争议)。 –

+0

谢谢弗兰克。但我观察到,我已经使用我的Google帐户登录到应用程序,并且在2天后仍然登录。这是我想知道的。一旦我登录,这些令牌何时到期,用户必须重新登录才能获得新的令牌? –