Flutter集成Firebase时signInWithPassword出现reCAPTCHA任务失败及无效凭证错误的解决咨询
看起来你遇到的问题根源是Firebase App Check未配置加上reCAPTCHA验证失败,最终导致了"无效凭证"的报错。结合你提供的日志和代码,我整理了一套针对性的解决步骤:
一、先拆解日志里的关键错误信号
先从日志里抓核心问题:
W/LocalRequestInterceptor(30372): Error getting App Check token; using placeholder token instead. Error: com.google.firebase.FirebaseException: No AppCheckProvider installed.
E/RecaptchaCallWrapper(30372): Initial task failed for action RecaptchaAction(action=signInWithPassword)with exception - The supplied auth credential is incorrect, malformed or has expired.
这说明:
- 你的应用完全没配置Firebase App Check,导致无法获取合法的请求验证Token,只能用占位符提交请求——而现在Firebase Auth的登录操作会强制验证App Check,直接拒绝了非法请求。
- 因为App Check的缺失,reCAPTCHA验证也直接失败,最终抛出了"无效凭证"的错误。
另外你的日志里显示signInWithEmailAndPassword successful for maven@gmail.com, uid=null是异常的:如果登录真的成功,uid绝对不可能为null,这说明你的日志逻辑可能有问题,实际登录请求并没有真正完成。
二、针对性解决步骤
1. 必须配置Firebase App Check
App Check是Firebase的安全验证机制,现在是Firebase Auth部分操作的硬性要求。你需要在main.dart的Firebase初始化后添加App Check的初始化代码:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await LocalNotificationsService.init(); await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); // 新增:初始化Firebase App Check await FirebaseAppCheck.instance.activate( // 安卓端:测试环境用debug provider,正式发布换成AndroidProvider.playIntegrity(推荐) androidProvider: AndroidProvider.debug, // iOS端:测试环境用AppleProvider.debug,正式发布换成AppleProvider.appAttest appleProvider: AppleProvider.debug, ); // 以下是你原有的代码 FirebaseFirestore.instance.settings = const Settings(persistenceEnabled: true); final FirebasePerformance performance = FirebasePerformance.instance; await performance.setPerformanceCollectionEnabled(true); runApp(const MyApp()); }
注意:
- 测试环境下,你需要从日志里找到debug token(格式类似
D/FirebaseAppCheck: Debug App Check token for device: XXXXX),然后在Firebase控制台的App Check设置里添加这个token,否则debug provider会失效。 - 正式发布时,要切换到生产环境的Provider(比如安卓用Play Integrity),并在Firebase控制台完成对应的配置(比如上传SafetyNet/Play Integrity的验证信息)。
2. 修正AuthService的重试逻辑
你现在的代码捕获invalid-credential就直接重试,这完全是无效操作——根源问题没解决,重试多少次都会失败。建议改成先提示用户,同时优化日志逻辑:
Future<User?> signInWithEmailAndPassword( String email, String password, ) async { try { UserCredential credential = await _auth.signInWithEmailAndPassword( email: email, password: password, ); // 优化日志:只有真正成功时才输出有效信息 if (credential.user != null) { print('ℹ️ INFO - AuthService: 登录成功,uid=${credential.user!.uid}'); } else { print('⚠️ WARNING - AuthService: 登录返回空用户,请检查账号状态'); } return credential.user; } on FirebaseAuthException catch (e) { switch (e.code) { case 'invalid-credential': showToast(message: '验证失败,请检查网络或稍后重试'); break; case 'user-not-found': case 'wrong-password': showToast(message: ToastTexts.invalidEmailOrPassword); break; default: showToast(message: '${ToastTexts.contactAnAdmin}: ${e.code}'); } } catch (e) { showToast(message: ToastTexts.somethingWentWrong); } return null; }
3. 再次验证SHA-256配置
你提到已经配置了SHA-256,但要确认:
- 你添加的是debug版本的SHA-256(模拟器测试用的是debug签名),可以通过以下命令获取:
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android - 在Firebase控制台的项目设置 > 应用里,你的安卓应用已经添加了正确的SHA-1和SHA-256指纹。
- 配置完成后,务必重新下载
google-services.json替换项目里的旧文件。
4. 检查账号状态
最后再确认一次:
- 该邮箱账号在Firebase Auth的用户列表中存在,并且状态是"启用"的。
- 账号没有被锁定、密码没有过期。
三、验证效果
完成所有配置后重新运行应用,观察日志:
- 如果App Check初始化成功,会看到
I/FirebaseAppCheck: App Check activated with provider的日志。 - 登录时不会再出现"empty reCAPTCHA token"和"No AppCheckProvider installed"的错误。
内容来源于stack exchange

