Firebase sendPasswordReset函数异常:未注册邮箱无报错求助
问题:Firebase密码重置未抛出未注册邮箱错误
我的iOS应用基于Firebase Auth实现密码重置功能,输入已注册邮箱调用sendPasswordReset时功能正常,但输入未注册邮箱时,函数仍正常执行,未按预期抛出“Firebase中无此账户”的错误,求解决办法。
相关代码
AuthManager中的重置密码函数
func resetPassword(email: String) async throws { do { try await auth.sendPasswordReset(withEmail: email) } catch { print("Throw an error") throw AuthErrorHandler.resetPasswordError } }
PasswordRecoveryViewModel代码
@MainActor final class PasswordRecoveryViewModel: ObservableObject { @Inject private var authenticationManager: AuthenticationManagerInterface @Published var email: String = "" func resetPassword() async throws { try validation() try await authenticationManager.resetPassword(email: email) } private func validation() throws { try Validation.validateField(email, fieldName: "email") try Validation.validateEmail(email: email) } }
视图中的恢复按钮代码
private var recoveryButton: some View { Button { Task { do { try await viewModel.resetPassword() print("password reset!") launchViewModel.showRecoveryView.toggle() } catch { self.launchViewModel.error = error } } } label: { Text("Recovery now!") .withMainButtonViewModifier() } }
解决方案
1. 调整Firebase Auth控制台设置
Firebase默认开启邮箱枚举保护,会隐藏未注册邮箱的错误提示,防止攻击者枚举已注册用户。你需要:
- 打开Firebase控制台,进入Authentication > 设置 > 高级
- 找到密码重置选项,关闭启用邮箱枚举保护
关闭后,输入未注册邮箱时sendPasswordReset会正常抛出对应错误。
2. 优化错误捕获逻辑
当前代码将所有错误统一抛出AuthErrorHandler.resetPasswordError,无法区分具体错误类型。修改AuthManager代码,精准捕获Firebase原生错误:
func resetPassword(email: String) async throws { do { try await auth.sendPasswordReset(withEmail: email) } catch let error as NSError { print("Firebase error: \(error)") // 判断是否为用户不存在的错误 if error.code == AuthErrorCode.userNotFound.rawValue { throw AuthErrorHandler.userNotFound } else { throw AuthErrorHandler.resetPasswordError } } catch { throw AuthErrorHandler.resetPasswordError } }
3. 上层处理具体错误类型
在视图的Task中,根据捕获到的错误类型给用户对应提示:
Task { do { try await viewModel.resetPassword() print("password reset!") launchViewModel.showRecoveryView.toggle() } catch AuthErrorHandler.userNotFound { launchViewModel.error = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey: "Firebase中无此账户"]) } catch { self.launchViewModel.error = error } }
内容的提问来源于stack exchange,提问作者Sonix
相关产品推荐
相关产品推荐

