You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:52:45