Firebase Auth迁移后老用户UID变更致无法访问Firestore数据
老用户登录Firebase认证后UID变更导致Firestore数据无法访问的原因分析
问题背景
用户数据存储在Firestore中,文档ID使用Firebase Authentication的用户UID(通过fAuth.currentUser.uid获取)。旧版Java应用迁移至Kotlin新项目(关联同一Firebase项目)后,新用户正常,但老用户登录后获取的UID与原UID不符,导致Firestore查询返回不存在的快照,最终因访问空数据崩溃。
使用邮箱密码认证,老用户邮箱和密码未变,登录流程正常。新旧项目仅存以下差异:
- 应用命名空间(package name)变更
settings.gradle中的rootProject.name修改- 迁移前丢失密钥库并更换了上传密钥
核心原因:签名不一致触发Firebase创建新用户
Firebase邮箱密码认证中,同一邮箱在签名不同的应用下会被视为独立用户,生成不同UID,你的情况里关键触发因素是:
1. 上传密钥更换导致签名哈希不匹配
Firebase依赖应用的签名哈希值关联应用与认证服务。更换上传密钥后,新项目的签名哈希和旧Java项目完全不同。老用户用同一邮箱登录时,Firebase会判定为新用户,自动生成新UID,而非匹配旧用户的原有记录。
2. 应用命名空间变更的间接影响
若你在Firebase控制台为新命名空间单独添加了应用(而非修改旧应用配置),Firebase会将其视为独立应用实例。结合签名哈希的差异,进一步触发了新用户的创建逻辑。
验证步骤
- 登录Firebase控制台,进入Authentication > 用户页面,搜索老用户邮箱:
- 会发现两条用户记录,分别对应旧Java应用和新Kotlin应用的UID
- 对比签名哈希:
- 在项目设置 > 你的应用中,查看新旧应用的签名证书指纹,确认两者不一致
解决方案
1. 恢复旧签名哈希到新项目
若能找回旧密钥库,生成对应签名哈希并添加到Firebase新应用配置:
- 用keytool生成哈希:
keytool -exportcert -list -v -alias <密钥别名> -keystore <旧密钥库路径> - 将生成的SHA-1/SHA-256添加到Firebase新应用的签名证书指纹列表中
2. 合并用户数据(旧密钥无法恢复时)
如果旧密钥库彻底丢失,需手动迁移数据:
- 在Firestore中,将旧UID对应的文档数据复制到新UID的文档中
- 或修改查询逻辑,通过唯一邮箱字段而非UID查询用户数据
3. 临时修复崩溃问题
在updateUserData方法中补充空值判断,避免空指针:
private suspend fun updateUserData(userSnapshot: DocumentSnapshot?) { if (userSnapshot != null && userSnapshot.exists()) { // 增加文档存在性判断 userDataStore.updateData { user -> user.toBuilder() .setNombre(userSnapshot.getString(KEY_NOMBRE) ?: "") // 空值兜底 .setTelefono(userSnapshot.getString(KEY_TELEFONO) ?: "") .setEmail(userSnapshot.getString(KEY_EMAIL) ?: "") .setToken(userSnapshot.getString(KEY_TOKEN) ?: "") .setMesa(userSnapshot.getString(KEY_MESA) ?: "") .setIsPresent(userSnapshot.getBoolean(KEY_IS_PRESENT) ?: false) .setBonos(userSnapshot.getLong(KEY_BONOS) ?: 0) .build() } } }
内容的提问来源于stack exchange,提问作者Zaphod
相关产品推荐
相关产品推荐

