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

Flutter集成Firebase时signInWithPassword出现reCAPTCHA任务失败及无效凭证错误的解决咨询

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.

这说明:

  1. 你的应用完全没配置Firebase App Check,导致无法获取合法的请求验证Token,只能用占位符提交请求——而现在Firebase Auth的登录操作会强制验证App Check,直接拒绝了非法请求。
  2. 因为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 08:34:31