如果我直接从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')事件时接收消息。