Flutter中Firebase Auth登录异常处理失效问题求助
问题分析与解决方案
问题原因
Firebase Auth 出于安全考量,在新版SDK中不再区分user-not-found和wrong-password错误,而是统一返回INVALID_LOGIN_CREDENTIALS,目的是防止恶意攻击者通过登录尝试枚举系统中存在的邮箱地址。这就是你无论输入错误密码还是不存在的邮箱,都会进入else分支的原因。
解决方案
要实现区分两种错误场景的需求,你需要先单独检查邮箱是否存在,再执行登录操作:
signIn() async { try { // 先检查邮箱是否已注册 final signInMethods = await FirebaseAuth.instance.fetchSignInMethodsForEmail( emailController.text.trim(), ); if (signInMethods.isEmpty) { // 邮箱未注册 print("no user found"); return; } // 邮箱已存在,执行登录 await FirebaseAuth.instance.signInWithEmailAndPassword( email: emailController.text.trim(), password: passwordController.text.trim(), ); } on FirebaseAuthException catch (e) { if (e.code == 'wrong-password') { print(e.message); print("wrong password"); } else { print(e.code); print("something went wrong"); } } catch (e) { // 捕获其他非FirebaseAuth异常 print("something went wrong: $e"); } }
说明
fetchSignInMethodsForEmail方法会返回该邮箱对应的登录方式列表,如果为空则说明邮箱未注册- 先完成邮箱存在性检查后,再执行登录,此时如果抛出异常,就可以确定是密码错误(因为邮箱已确认存在)
- 保留全局异常捕获,处理其他可能的意外情况
内容的提问来源于stack exchange,提问作者Abdul Haseeb
相关产品推荐
相关产品推荐

