Firebase Authentication(邮箱&密码):解决禁用/删除用户仍登录问题
解决Firebase Auth控制台修改用户状态后客户端未同步的问题
Firebase Auth会在本地缓存用户会话,当你在控制台禁用或删除用户后,本地缓存不会自动同步服务端的状态变更。直接判断Firebase.auth.currentUser != null只能检测本地是否有缓存的用户记录,无法验证该用户在服务端的实际有效性,这就是问题的根源。
以下是两种正确的修改方案:
方法1:调用reload()同步用户最新状态
reload()会从服务端拉取用户的最新信息,之后再检查用户是否处于启用状态:
private fun checkLogged() { val currentUser = Firebase.auth.currentUser currentUser?.let { user -> user.reload() .addOnCompleteListener { task -> if (task.isSuccessful) { val refreshedUser = Firebase.auth.currentUser // 验证用户是否存在且处于启用状态 if (refreshedUser != null && refreshedUser.isEnabled) { startActivity(Intent(this@LoginActivity, MainActivity::class.java)) finish() } else { Firebase.auth.signOut() } } else { // 刷新失败,说明用户已失效 Firebase.auth.signOut() } } } ?: run { Firebase.auth.signOut() } }
方法2:强制刷新ID Token验证有效性
调用getIdToken(true)强制从服务端获取新的Token,若用户已被禁用或删除,该方法会直接返回失败:
private fun checkLogged() { val currentUser = Firebase.auth.currentUser currentUser?.let { user -> user.getIdToken(true) .addOnCompleteListener { task -> if (task.isSuccessful) { // Token获取成功,用户状态有效 startActivity(Intent(this@LoginActivity, MainActivity::class.java)) finish() } else { // Token获取失败,执行登出 Firebase.auth.signOut() } } } ?: run { Firebase.auth.signOut() } }
注意事项
- 这两个方法都是异步操作,必须在回调中处理结果,不能同步执行后立即判断状态。
- 频繁调用会产生网络开销,建议只在启动页这类关键节点使用。
内容的提问来源于stack exchange,提问作者Mert Ozan
相关产品推荐
相关产品推荐

