尽管完全相同的 flutter 代码,为什么 Appcheck 会从已发布的 Android 而不是 iPhone 随机生成无效请求

Can*_*000 6 android firebase flutter firebase-app-check

我构建了一个使用flutterFirebase Firestore和 的应用程序Firebase Authentication

我使用完全相同的基本代码在Android Play store(内部测试)和Apple App Store( )中发布了我的应用程序。Testflightflutter

问题:

为什么 App Check 每隔几个小时就无法识别一些 Android 请求(未验证:无效请求),而它会将所有其余请求识别为已验证......同时 App Check 可以识别(已验证的请求)100% 的 iPhone 请求?当我从设备重新启动应用程序时,它甚至可以识别相同的 Android 应用程序

解释:

  1. 这是仅显示Android应用程序请求(来自 1 台设备)的快照:您可以在开头看到“未验证”(参见图中的红色箭头),然后在几个小时内全部变为“已验证”,然后再次 1“未经验证”(此处未显示)等等。

仅显示 Android 应用程序请求的快照

2 - 这是仅显示iPhone应用程序请求(来自 1 台设备)的快照:您可以看到所有内容都按预期“验证”,即使在几个小时或几天后也是如此。

在此输入图像描述

代码:

  Future <void> main() async{
    WidgetsFlutterBinding.ensureInitialized(); 
    await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform,);
    await FirebaseAppCheck.instance.activate(
        androidProvider: AndroidProvider.playIntegrity, appleProvider: AppleProvider.appAttestWithDeviceCheckFallback);
    runApp(AuthUserProviderWidget());
  }
Run Code Online (Sandbox Code Playgroud)

对于签名密钥,我使用 Google Play Console > 发布 > 设置 > 应用签名 > 应用签名密钥证书 > SHA-256 中的密钥

我将该 SHA-256 复制到 Firebase > 应用检查 > 应用 > Android > Play Integrity >SHA-256 证书指纹

更新1:

我尝试过“强制”appcheck:相同的结果...我尝试过不同的Android手机设备:同样的事情(大部分是“已验证”,直到几个小时后我得到“未经验证”的)...我尝试使用“上传密钥”的 SHA256:这个对 appcheck 根本不起作用...我迷路了,有人有什么想法吗???

更新2:

我曾经kReleaseMode确认它是发布模式...但 Android 仍然存在同样的问题:所有请求都经过验证,然后随机一个请求未经验证并被阻止...然后,后续调用再次验证...我也更新到了最后flutter (3.13.4) 和 Appcheck 0.2.0 以及所有 Firebase 的版本...仍然相同...

因为错误后重新运行应用程序总是运行顺利,所以我还尝试在初始化 Firebase 后和激活 AppCheck 后添加人为延迟...我也尝试激活多次...我尝试过await FirebaseAppCheck.instance.setTokenAutoRefreshEnabled(true);...仍然是相同的随机错误,每隔几个小时一次

更新3: 请参阅下面描述的“部分解决方案”...基本上,我能够通过强制 a getToken(true)and来减少此错误的频率setTokenAutoRefreshEnabled(true)...但错误仍然每隔几个小时发生一次...它似乎在应用程序出现时发生从长时间处于后台回到前台

更新 4: 在这个问题出现 2 个月后,我仍在积极寻找解决方案...同时查看是否有其他人遇到同样的错误,还是只有我一个人遇到这个错误?

Can*_*000 0

部分解决方案:

我能够找到问题的“部分”解决方案。我不得不强迫 agetToken(true)setTokenAutoRefreshEnabled(true)

Future<void> main() async{
WidgetsFlutterBinding.ensureInitialized(); 
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform,);
await FirebaseAppCheck.instance.activate(androidProvider: AndroidProvider.playIntegrity, appleProvider: AppleProvider.appAttestWithDeviceCheckFallback);
await FirebaseAppCheck.instance.getToken(false); // Solution here
await FirebaseAppCheck.instance.setTokenAutoRefreshEnabled(true);// and solution here

runApp(...);
Run Code Online (Sandbox Code Playgroud)

我认为原因是这activate是一个惰性调用,但这看起来像是他们需要在此 Beta 版本中修复的错误... getToken 似乎强制调用并避免错误。

到目前为止,on resume当应用程序从后台长时间返回前台后,我仍然遇到应用程序检查错误...仍然需要修复此问题。