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

Flutter强制启用App Check时Android模拟器报权限拒绝错误

Android模拟器App Check适配Firestore报权限拒绝修复方案

按以下优先级逐一排查调整,90%以上的同类问题都是初始化顺序错误导致的:

  • 修正初始化顺序错误
    你当前在MainActivity.kt中配置原生Debug App Check Provider的写法完全无效:Flutter引擎启动后会先执行Dart层的Firebase.initializeApp()和AppCheck.activate(),提前拿到无效的App Check token,后续原生onCreate里再设置Provider不会刷新已签发的token。
    修复步骤:
    1. 删除MainActivity.kt中所有手写的FirebaseApp.initializeApp、installAppCheckProviderFactory相关代码,原生侧不需要做任何额外配置。
    2. 修改Flutter端App Check激活逻辑,显式指定debug环境下的provider,不要依赖原生侧注入:
      import 'package:flutter/foundation.dart';
      
      // main函数内初始化逻辑
      await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
      await FirebaseAppCheck.instance.activate(
        androidProvider: kDebugMode ? AndroidProvider.debug : AndroidProvider.playIntegrity,
        appleProvider: kDebugMode ? AppleProvider.debug : AppleProvider.appAttest,
      );
      
    3. 完全卸载模拟器上已安装的应用,冷启动模拟器后重新编译运行,禁止用热重载/热重启验证。
  • 校验debug token有效性
    Android模拟器的debug token不是固定值,卸载重装、清除应用数据、擦除模拟器数据后都会重新生成。运行应用后在Logcat过滤DebugAppCheckProvider关键字,找到日志中打印的debug secret值,和Firebase控制台App Check调试令牌列表中已添加的token逐字比对,不一致就替换为新生成的token,添加后等待2分钟再重试请求。
  • 移除手动指定的原生依赖
    你在app/build.gradle中手动引入的com.google.firebase:firebase-appcheck-debug:16.0.0大概率和FlutterFire插件依赖的原生SDK版本冲突,直接删掉这行依赖,firebase_app_check Flutter插件会自动拉取匹配版本的debug包,手动指定版本反而会导致SDK能力异常。
  • 临时调整安全规则定位问题
    可以临时把Firestore安全规则调整为如下形式,显式放行带有效App Check token的请求,若调整后请求正常,可100%确认是App Check token签发/校验环节的问题:
    match /Contractor/{contractor} {
      allow read, write: if request.auth != null && request.appCheck.token != null;
    }
    
    该规则仅用于调试,上线前需调整为严格校验逻辑
  • 生效判定标准
    Logcat过滤FirebaseAppCheck,出现Successfully retrieved App Check token日志时,说明debug模式下的App Check已经正常工作,此时再调用Firestore接口不会再报权限拒绝错误。

内容的提问来源于stack exchange,提问作者valley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:24:16