簡體   English   中英

從 console.firebase.google.com 取消用戶后,用戶身份驗證仍然存在

[英]User authentication persisted after having cancelled the user from console.firebase.google.com

如果我直接從 Firebase 控制台中刪除用戶,該用戶在我的 Android 設備上仍然擁有有效數據。

當然,如果我隨后訪問無法按預期工作的 firebase 資源(例如實時數據庫)。

但這會導致客戶端錯位,因為如果我有有效的用戶數據,我會為經過身份驗證的用戶顯示特定的 UI,相反,如果我沒有經過身份驗證的用戶,我會顯示另一個 UI。

我該如何處理這種情況?

編輯:我發現了什么,但我現在不知道如果這沒問題或者是一種解決方法是在我的 FirebaseUser 上調用 reload()。

從文檔中這應該拋出和異常,但這不會發生。 發生的情況是我的用戶引用變為空:

private void initializeUI(FirebaseUser user) {
        user.reload();
        if (null != user) {
            mUser = user;
        } else {
           // User must have been disabled or deleted from console
        }

我在這里調用 initializeUI:

@Override
public void onAuthStateChanged(@NonNull final FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();

                if (null != user) {
                    initializeSignInUI(user);
                } else {
                    initializeSignOutUI();
                }
            } 

作為更多信息:

如果我打開我的應用程序,用戶在客戶端仍然活着。 身份驗證用戶的觸發器被觸發,在這里,通過我上面的代碼,我可以管理這種情況。 但我不知道這實際上是一種解決方法還是正確的做法。

編輯 2只是為了重新表述我的問題:

這種方法效果很好:

public boolean validUser(FirebaseUser user) {
        boolean validUser = false;
        if (null != user) {
            try {
                user.reload();
                if (null != user) {
                    validUser = true;
                }
            } catch (Exception e) {
            //} catch (FirebaseAuthInvalidUserException e) {
                validUser = false;
            }
        }
        return validUser;
    }

我可以認為這是一個有效的解決方案還是另一種最佳實踐? 此解決方案僅適用於 FirebaseAuth,無需與 FirebaseDatabase 交互。 每次必須檢查用戶身份驗證時,我都可以調用此方法。

如果您的用戶已登錄,在您的應用程序中並且您從 Firebase 控制台手動刪除它,則該用戶將保持活動狀態,直到令牌刷新。 因此,最多大約一個小時,用戶將保持經過身份驗證。 因此,如果您想立即限制用戶的訪問權限,則需要將其注銷。

但還有另一種解決方法,您可以在 Firebase 數據庫中創建一個名為usersToLogOut的新節點,並將所有用戶 ID 添加為keys ,將布爾值true為值。 數據庫應如下所示:

Firebase-root
     |
     --- usersToLogOut
             |
             --- uid1: true
             |
             --- uid2: true

下一步,當您手動刪除該帳戶時,您需要在該節點下添加用戶的uid。 您還需要使用 Firebase 安全規則來撤銷未經授權用戶的訪問權限。 規則應如下所示:

{
  "rules": {
    "usersToLogOut": {
      ".read": true,
      ".write": false
    },
    "posts": {
      ".read": "auth != null && !root.child('usersToLogOut').child(auth.uid).exists()"
    }
  }
}

編輯1:

根據您的編輯,您說: what I'm asking here is not how to secure my DB from him/her but I to check that It has been deleted但這是您可以通過使用以上規則。 如果您從控制台手動刪除用戶,這並不意味着您將刪除所有內容,包括數據庫記錄。 你需要自己做這件事。 所以最簡單的方法就是使用規則。

此外,如果您刪除所有用戶記錄,那么您可以添加一個偵聽器並強制他退出,但這意味着您需要在數據庫中搜索所有記錄並相應地刪除它們。 第一個解決方案更簡單,因為您只需要在數據庫中添加一條記錄即可!

編輯2:

當您手動刪除用戶時,這並不意味着firebaseUser對象將為null ,因此檢查無效性沒有任何意義,因為在下一次令牌刷新之前用戶仍將通過身份驗證。 所以要解決這個問題,你需要使用 Firebase 規則來限制訪問。

因此,您的代碼將始終有效。 我想說的是,在您從控制台手動刪除用戶到刷新令牌的時間之間,用戶仍然可以訪問您的應用程序的時間可能長達一個小時,就算他被刪了。 要停止此操作,在那一小時內,您需要使用上述解決方案。

根據OP的評論Edit3:

您的代碼運行良好並且始終有效,但問題是,即使您從控制台刪除用戶,他仍然可以訪問數據庫,直到下一次令牌刷新。 是的,用戶將能夠訪問數據庫。 該令牌將在大約一個小時內有效,如果您不想要,您可以限制使用安全規則,在那個小時內用戶不再具有訪問權限。

換句話說,如果您也從客戶端刪除它並且它無效並且如果其他人“被盜”,則此令牌可以使用它來訪問數據庫。 不是使用您的應用程序的用戶,而是可能竊取該令牌的人。

要檢查用戶是否已在數據庫中刪除,請嘗試以下操作:

FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
String useruid=user.getUid();
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users").child(useruid);
ref.addValueEventListener(new ValueEventListener(){
 @Override
public void onDataChange(DataSnapshot dataSnapshot) {
  if(!dataSnapshot.exists()){
     //update UI
 }
}

  @Override
 public void onCancelled(FirebaseError firebaseError) {


   }
});

上面將檢查 useruid 是否存在,並且由於您也從數據庫中刪除,因此不會找到它,然后您可以使用setVisiblity()更新 UI 假設您在 DB 中有這個:

    users
      useruid
         username: userx
         email: userx@gmail.com
      useruid
         username: usery
         email:usery@gmail.com

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM