Firebase Auth更新邮箱功能异常及邮箱合法性校验问题咨询
邮箱更新功能修复方案
原有代码存在的问题
- 未做邮箱格式合法性校验,无效邮箱会直接写入数据库
- 先更新数据库再更新Firebase Auth,若Auth更新失败(如格式非法、用户近期未登录需要重新认证、邮箱已被占用),会出现数据库和Auth数据不一致的情况
- 未处理Auth更新操作的异步结果,无法保证两边数据同步
修复后代码
import android.util.Patterns; import com.google.firebase.auth.FirebaseAuthUserCollisionException; import com.google.firebase.auth.FirebaseAuthRecentLoginRequiredException; import com.google.firebase.auth.FirebaseUser; // ...其余原有导入保持不变 private void updateProfile1(String newEmail) { // 第一步:先做邮箱合法性校验,规则和注册环节保持一致 if (newEmail == null || newEmail.trim().isEmpty()) { Toast.makeText(this, "邮箱不能为空", Toast.LENGTH_SHORT).show(); return; } // 调用系统邮箱格式校验规则,可替换为注册时自定义的校验逻辑 if (!Patterns.EMAIL_ADDRESS.matcher(newEmail.trim()).matches()) { Toast.makeText(this, "请输入合法的邮箱格式", Toast.LENGTH_SHORT).show(); return; } String cleanedEmail = newEmail.trim(); FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser(); if (currentUser == null) { Toast.makeText(this, "用户未登录,请重试", Toast.LENGTH_SHORT).show(); return; } // 第二步:先更新Firebase Auth的邮箱,成功后再同步到数据库 currentUser.updateEmail(cleanedEmail) .addOnCompleteListener(task -> { if (task.isSuccessful()) { // Auth更新成功,再写入实时数据库 DatabaseReference reference = FirebaseDatabase.getInstance() .getReference("MyUsers") .child(currentUser.getUid()); HashMap<String, Object> hashMap = new HashMap<>(); hashMap.put("email", cleanedEmail); reference.updateChildren(hashMap) .addOnSuccessListener(aVoid -> Toast.makeText(this, "邮箱更新成功", Toast.LENGTH_SHORT).show() ) .addOnFailureListener(e -> Toast.makeText(this, "数据库同步失败:" + e.getMessage(), Toast.LENGTH_SHORT).show() ); } else { // Auth更新失败,返回对应错误提示 String errorMsg = "邮箱更新失败:"; if (task.getException() instanceof FirebaseAuthUserCollisionException) { errorMsg += "该邮箱已被其他账号占用"; } else if (task.getException() instanceof FirebaseAuthRecentLoginRequiredException) { errorMsg += "您最近未登录,请重新认证后再修改邮箱"; } else { errorMsg += task.getException().getMessage(); } Toast.makeText(this, errorMsg, Toast.LENGTH_SHORT).show(); } }); }
额外注意事项
- 如果你注册环节使用的是自定义邮箱校验规则,直接替换上述代码中的
Patterns.EMAIL_ADDRESS校验逻辑即可,保证前后规则一致 - 遇到
FirebaseAuthRecentLoginRequiredException错误时,可引导用户重新输入密码完成二次认证后再执行修改操作 - 无需额外做邮箱重复校验,Firebase Auth会自动检测邮箱是否被其他账号占用,直接返回对应错误即可
内容的提问来源于stack exchange,提问作者user15908935
相关产品推荐
相关产品推荐

