当前位置: 首页 > 面试题库 >

从console.firebase.google.com取消用户后,用户身份验证仍然存在

巫化
2023-03-14
问题内容

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

当然,如果我随后访问无法正常运行的Firebase资源(例如,实时数据库)。

但这会导致客户端不对齐,因为如果我有有效的用户数据,则会显示经过身份验证的用户的特定用户界面,而不是如果我没有经过身份验证的用户,则会显示另一个用户界面。

我该如何处理这种情况?

编辑: 我已经找到了什么,但是我现在不知道这是否可行或解决方法是在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的评论编辑:

您的代码可以正常工作,并且始终可以工作,但是问题是,即使您从控制台删除用户,在下一次刷新令牌之前,他仍将具有数据库访问权限。是的,用户将能够访问数据库。该令牌的有效期约为一个小时,如果您不希望使用该令牌,则可以限制使用安全规则,并且在该小时内该用户不再具有访问权限。

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



 类似资料:
  • 于是我在这里看到:https://firebase . Google . com/docs/auth/web/account-linking # link-auth-provider-credentials-to-a-user-account现在可以在Firebase中链接用户账号了。我还看到Firebase提供了匿名认证的功能,它为一个用户创建一个用户会话,不需要任何凭证。 在我们的应用程序中,

  • 我一直在寻找使用各种AWS服务来处理我们下一个主要项目的基础设施。我们开始研究EC2实例上的docker容器,但在进一步研究AWS Lambda之后,这似乎是一条值得探索的道路。 使用AWS Lambda范例,我们只需使用Lambda函数作为逻辑粘合剂,将数据和事件(来自其他AWS服务)保存在一起。 例如,如果我们产品的用户创建了一个新记录,AWS Lambda可以在该事件中触发,我们可以调用La

  • 我已经实现了keycloak用户存储SPI流。它针对外部源进行身份验证。Keycloak是用外部存储属性更新的,如果它在getUserByUsername方法中更新,它就可以工作。 我正在isValid方法中验证userValidation,并更新UserModel和LocalHashMap中的userAttributes。 从日志中,我看到UserStoreProviderFactory创建了两

  • 我正在尝试创建一个应用程序,我必须注册用户,我正在使用Firebase进行注册,一旦我将所有数据放入register,然后进入Firebase数据库,我发现我自己并不是在测试模式下创建数据库的注册用户。你能解释一下我可能做错了什么吗? 注册用户代码: 我正在使用实时数据库 规则Firebase:

  • 问题内容: 是否存在node.js的现有用户身份验证库?特别是,我正在寻找可以对用户进行密码身份验证的东西(使用自定义后端身份验证数据库),并将该用户与会话相关联。 在编写身份验证库之前,我认为我会看看人们是否知道现有的库。通过Google搜索找不到任何明显的内容。 -Shreyas 问题答案: 看起来连接中间件的connect-auth插件正是我所需要的:http : //wiki.github

  • 我想知道socket.io身份验证的最佳实践是什么。 Alice发出事件'message',参数包括Bobs、唯一标识符等。Bob在监听Socket.on('message')事件时接收消息。