【问题标题】:User authentication persisted after having cancelled the user from console.firebase.google.com从 console.firebase.google.com 取消用户后,用户身份验证仍然存在
【发布时间】:2018-02-19 08:50:55
【问题描述】:

如果我直接从 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 交互。 我可以在每次必须检查用户身份验证时调用此方法。

【问题讨论】:

  • 数据库中有用户节点吗?
  • 登录后(用户在 Auth 部分创建)我在我的数据库上创建了一个用户节点,是的。但是当我从控制台中删除时,我有一个触发器可以清理我的数据库。
  • @AL。我的情况完全不同。我已经编辑了我的答案以更好地解释这个场景。如果我的设备中有一个已经过身份验证的用户,并且我从控制台中将其删除,那么我在这里要问的不是如何保护我的数据库免受他/她的侵害,而是我要检查它是否已被删除以更新我的 UI 和辅助更新我的环境以防止用户通过身份验证。
  • @AL。所以我认为这不是重复的。我要求更多。

标签: java android firebase firebase-realtime-database firebase-authentication


【解决方案1】:

如果您的用户已在您的应用程序中登录,并且您从 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 规则来限制访问。

因此您的代码将始终有效。我想说的是,从您从控制台手动删除用户到您获得刷新令牌的时间之间,用户仍然可以访问您的应用程序的时间可能长达一个小时,即使他被删除。要阻止这种情况,在那一小时内,您需要使用上述解决方案。

Edit3 根据 OP 的 cmets:

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

换句话说,如果您也从客户端将其删除,并且如果它无效并且如果其他人“窃取”了此令牌,则可以使用它来访问数据库。不是正在使用您的应用的用户,而是可能窃取该令牌的人。

【讨论】:

  • 嗨,亚历克斯,如果您查看我的其他编辑,我已经构建了一个不包括访问数据库但仅处理 FirebaseAuth 的方法。我已经从数据库端获得了清除已删除用户的所有触发器。
  • 我看到了这个,这就是我相应地回答你的原因。当您删除用户manually 时,这并不意味着firebaseUser 对象将是null,因此检查无效性没有任何意义,因为在下一次令牌刷新之前用户仍将被验证。所以要解决这个问题,你需要使用 Firebase 规则来限制访问。
  • 所以你告诉我上面的代码运行良好,但有可能它无法运行?因为到目前为止,在我的应用程序中,此代码正在运行。
  • 似乎 .reload() 也刷新了用户令牌。
  • 不,您的代码将始终有效。我想说的是,从您从控制台手动删除用户到您获得刷新令牌的时间之间,用户仍然可以访问您的应用程序的时间可能长达一个小时,即使他被删除。要阻止这种情况,在那一小时内,您需要使用上述解决方案。
【解决方案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) {


   }
});

上面将检查用户uid是否存在,并且由于您也从数据库中删除,所以找不到它,然后您可以使用setVisiblity()更新UI 假设你在 DB 中有这个:

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

【讨论】:

    猜你喜欢
    • 2018-01-11
    • 2013-03-24
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多