无法使AppCheck(在模拟器上调试)在Flutter应用程序上工作

camsedfj  于 2023-01-31  发布在  Flutter
关注(0)|答案(3)|浏览(158)

我有一个flutter应用,添加了AppCheck,使用Android Emulator进行测试和调试,我正在测试Realtime数据库的访问,在我的Firebase Console中,AppCheck显示我所有的访问都是这种类型:未验证:无效的请求。我已遵循此:https://firebase.google.com/docs/app-check/android/debug-provider.
我的应用/build.gradle

dependencies {
    ...
    //implementation 'com.google.firebase:firebase-appcheck-safetynet:16.0.0-beta02'
    implementation 'com.google.firebase:firebase-appcheck-debug:16.0.0-beta03'
    ...
}

在我的主. dart

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp();

  // Initialize AppCheck
  await FirebaseAppCheck.instance.activate();
...

在MainActivity.kt中,我有以下内容:

import io.flutter.embedding.android.FlutterActivity
import android.os.Bundle
import android.util.Log
import com.google.firebase.FirebaseApp
import com.google.firebase.appcheck.FirebaseAppCheck
import com.google.firebase.appcheck.debug.DebugAppCheckProviderFactory
//import com.google.firebase.appcheck.safetynet.SafetyNetAppCheckProviderFactory

class MainActivity: FlutterActivity() {
    // For Debug Only. Do not do this for Production
    override fun onCreate(savedInstanceState: Bundle?) {
        FirebaseApp.initializeApp(this)
        Log.e("MainActivity", "onCreate")
        val firebaseAppCheck = FirebaseAppCheck.getInstance()
        firebaseAppCheck.installAppCheckProviderFactory(DebugAppCheckProviderFactory.getInstance())
        super.onCreate(savedInstanceState)
    }
}

在logcat中,我可以看到以下日志
com.google.firebase.appcheck.debug.internal.DebugAppCheckProvider: Enter this debug secret into the allow list in the Firebase Console for your project: xxxxxxxxxxxxx
基于该标记,我使用托管调试标记并将其设置为调试标记。
使用AppCheck
Realtime Database only shows unverified requests
我希望看到已验证的请求显示。
我还使用Android Studio Profiler来监控网络,我可以看到请求
POST https://firebaseappcheck.googleapis.com/v1beta/projects/<app>/apps/<appid>:exchangeSafetyNetToken?key=<key>
有效载荷中有一个JSON安全网令牌。
我得到的响应是403。
注意,我没有打开实时数据库上的强制。
AppCheck缺少了什么?我应该使用模拟器看到验证过的请求还是只在真实的物理设备上(发布模式)?

bvuwiixz

bvuwiixz1#

我尝试使用onCreate,但无法使其工作。
使用MethodChannel可以代替:🎉:

// main.dart

void main() async {
 // ...

 await Firebase.initializeApp();
 await FirebaseAppCheck.instance.activate();

 // FirebaseAppCheck when enforced would block incoming requests from Android emulator and iOS simulator too.
 // This kDebugMode check gets a debug token from FirebaseAppCheck which can then be added on the Firebase
 // console so that the emulator and simulator can be allowed to access to Firestore.
 if (kDebugMode) {
  try {
   const MethodChannel methodChannel = MethodChannel("method-channel");
   await methodChannel.invokeMethod("getFirebaseAppCheckDebugToken");
  } catch (e) {
   print("FirebaseAppCheck debug token error: $e");
  }
 }

 // ...
}
// MainActivity.kt

package com.yourname.applicationname

import android.util.Log
import androidx.annotation.NonNull
import com.google.firebase.FirebaseApp
import com.google.firebase.appcheck.FirebaseAppCheck
import com.google.firebase.appcheck.debug.DebugAppCheckProviderFactory
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "method-channel").setMethodCallHandler { call, result ->
            if (call.method == "getFirebaseAppCheckDebugToken") {
                FirebaseApp.initializeApp(this)
                Log.d("configureFlutterEngine", "FirebaseApp.initializeApp")

                val firebaseAppCheck = FirebaseAppCheck.getInstance()
                Log.d("configureFlutterEngine", "firebaseAppCheck")
                firebaseAppCheck.installAppCheckProviderFactory(DebugAppCheckProviderFactory.getInstance())
                Log.d("configureFlutterEngine", "installAppCheckProviderFactory")

                result.success("Yay!")
            }
        }
    }
}

在Flutter调试模式下,Android模拟器上每次启动应用的结果:

jq6vz3qz

jq6vz3qz2#

我设法通过添加以下条件解决了这个问题(在调试模式下):

if (kReleaseMode) {
   await FirebaseAppCheck.instance.activate(); 
}
nle07wnf

nle07wnf3#

要确保AppCheck在flutter项目中正常工作,请确保安装了firebase_app_check包。安装后,您可以按如下方式使用它:

import 'package:firebase_app_check/firebase_app_check.dart';
import 'package:flutter/foundation.dart';

main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  // AppCheck
  await FirebaseAppCheck.instance.activate(
    androidProvider: kDebugMode ? AndroidProvider.debug : AndroidProvider.playIntegrity
  );

  // The rest of your code
}

使用上面的三元运算符可以设置它,然后忘记它,只要记住启用Enable App Check enforcement就可以了。
记住:

      • 依赖项。**确保您在 * app/build. gradle * 文件(31.2.0版)中的依赖项中包含implementation platform('com.google.firebase:firebase-bom:31.2.0')。安装了bom后,您无需单独导入每个firebase服务。bom会为您处理这些事务。

您可以在这里比较物料清单版本。

      • AppCheck将只在发布版本中工作。**对于开发使用,有调试代码。好的一面是你只需要为每台设备的每个 * 新 * 安装设置调试代码。这通常意味着你可以一直创建新的版本,只要你不从你的模拟器中卸载它。但是记住前几个字符以防万一也没有坏处。
  • 这可能是一个孤立的情况下,但如果appcheck仍然不会在生产尝试安装从Playstore创建一个新的版本。
  • 导入package:flutter/foundation.dart可访问kDebugMode

相关问题