2016-07-13 557 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天后仍然登錄。這是我想知道的。一旦我登錄,這些令牌何時到期,用戶必須重新登錄才能獲得新的令牌? –