[英]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.