幕后花絮
我在用Firebase 身份验证在我的 Android 应用程序中使用 Google、Facebook 和电子邮件/密码注册/加入用户。到目前为止,除了单个场景之外,几乎一切都运行良好。
场景
我需要disable or delete有时,Firebase 控制台中的用户帐户会禁止我的应用程序的某些用户。
在这种情况下,当我禁用或删除该特定用户时,该用户必须获得立即从应用程序注销并且不应该能够进一步使用它。
The Bug
我已经用过AuthStateListener
侦听身份验证状态更改,并在用户帐户被禁用或删除后自动注销用户。
FirebaseAuth.getInstance().addAuthStateListener(firebaseAuth -> {
if (firebaseAuth.getCurrentUser() == null) {
Intent intent = AuthFlowActivity.getCallingIntent(AuthFlowActivity.FORCE_LOGOUT);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
activityExitAnimation(BaseAppActivity.this);
}
});
但我从未见过 AuthStateListener 为这些操作触发任何事件。因此,我无法立即注销用户,而用户仍然可以继续使用该应用程序。
如果有人可以帮助解决这个问题,我将不胜感激。
禁用或删除用户帐户不会触发身份验证状态更改。也不应该,用户仍然经过身份验证。最多一小时内,Firebase 身份验证将尝试刷新用户的访问令牌。该刷新将失败,此时用户将未经身份验证,并且将触发身份验证状态更改事件。
如果您想撤销用户的授权立即,您将必须在应用程序逻辑的另一部分中执行此操作。执行此操作的常见方法是在应用程序中添加黑名单,例如在里面Firebase 数据库 https://firebase.google.com/docs/database/:
/bannedUsers
uidOfBannedUser: true
现在,当您在身份验证面板中删除/禁用用户帐户时,您还会将其 uid 添加到数据库中的禁止用户列表中。
然后,通过向您的数据库添加一个子句,可以防止未经授权的用户访问数据库。数据库安全规则 https://firebase.google.com/docs/database/security/, e.g.
{
"rules": {
"bannedUsers": {
".read": true,
".write": false // only admins can write these
},
"messages": {
".read": "auth != null && !root.child('bannedUsers').child(auth.uid).exists()"
}
}
}
如果使用不同的后端,实现会有所不同。但像这样的黑名单是禁止用户的常见方法。您会发现您甚至可能不太关心他们的身份验证,而只是禁止他们,而不是删除他们的凭据(他们可以简单地重新创建)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)