从console.firebase.google.com

时间:2018-02-19 08:50:56

标签: android firebase firebase-authentication

如果我直接从Firebase控制台删除用户,则此用户在我的Android设备上仍然拥有有效数据。

当然,如果我然后访问不能按预期工作的firebase资源(例如实时数据库)。

但这会导致客户端错位,因为如果我有有效的用户数据,我会为经过身份验证的用户显示特定的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进行交互。 我每次都可以调用此方法来检查用户身份验证。

2 个答案:

答案 0 :(得分:3)

如果您的用户已在您的应用程序中登录,并且您正在手动将其从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()"
    }
  }
}

<强> EDIT1:

根据您的编辑,您说:what I'm asking here is not how to secure my DB from him/her but I to check that It has been deleted但是通过使用上述规则,您可以更轻松地实现此目的。如果从控制台手动删除用户,这并不意味着您要删除所有内容,包括数据库记录。你需要自己做这件事。所以最简单的方法就是使用规则。

此外,如果删除所有用户记录,则可以添加侦听器并强制他注销,但这意味着您需要在数据库中搜索所有记录并相应地删除它们。第一个解决方案更容易,因为您只需要在数据库中添加一条记录即可!

<强> EDIT2:

当您手动删除用户时,这并不意味着firebaseUser对象将是null,因此要检查无效,它没有任何意义,因为用户仍将进行身份验证,直到下一个令牌刷新。因此,要解决此问题,您需要使用Firebase规则来限制访问权限。

所以你的代码将始终有效。我想说的是,在您从控制台手动删除用户的时间和刷新令牌的时间之间,用户仍然可以访问您的应用程序的时间长达一个小时,即使他被删除了。要在此时间内停止此操作,您需要使用上述解决方案。

根据OP的评论编辑3:

您的代码运行良好并且始终有效但问题是,即使您从控制台删除用户,他仍然会加入数据库,直到下一个令牌刷新。是的,用户将能够访问数据库。该令牌将在大约一小时内有效,如果您不希望这样,您可以限制使用安全规则,并且在该小时内用户无法再访问。

换句话说,如果你也从客户端删除它,如果它无效,如果其他人“被盗”,这个令牌可以用它来访问数据库。不是使用您的应用程序的用户,而是可能盗用该令牌的用户。

答案 1 :(得分:2)

要检查用户是否已在数据库中删除,请尝试以下操作:

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