Firestore在什么场景下会向用户集合自动添加oldEmail字段?
问题原因
Firebase 认证系统(Auth)和你自行维护的users业务集合是完全隔离的两套服务,Auth 侧的邮箱更新操作只会修改身份池中的用户邮箱属性,不会主动操作你的业务数据库,自然不会自动生成oldEmail字段。
修复方案
你需要在邮箱更新成功的回调逻辑中,手动向对应用户文档写入oldEmail字段,示例代码如下:
var user = firebase.auth().currentUser; const oldEmail = user.email; // 提前缓存旧邮箱 var credentials = firebase.auth.EmailAuthProvider.credential( oldEmail, password, ); user.reauthenticateWithCredential(credentials) .then(() => updateEmail(user, newEmail)) .then(() => { // 手动更新users集合的对应用户文档 return firebase.firestore().collection('users').doc(user.uid).update({ oldEmail: oldEmail, email: newEmail // 建议同步更新当前邮箱字段,保证业务数据和Auth一致 }) }) .catch((error) => { // 自定义错误处理逻辑 console.error('操作失败:', error) })
注意事项
- 操作前提前缓存旧邮箱,避免
updateEmail执行后user.email已经被修改,无法获取到原始旧邮箱值 - 建议同步更新业务集合中的
email字段,避免Auth侧数据和业务库数据不一致导致后续业务逻辑出错 - 可以在
catch分支添加回滚逻辑,如果业务库写入失败,就把Auth侧的邮箱改回旧值,保证两边数据一致性 - 确保对应的安全规则开放了
users集合对应用户文档的写权限,否则更新操作会被拦截 - 如果你使用的是Firebase实时数据库而非Firestore,把上述代码中的Firestore更新逻辑替换为实时数据库对应的
update/set方法即可
内容的提问来源于stack exchange,提问作者Mike L.
相关产品推荐
相关产品推荐

