将 Android 应用连接到 Firebase Auth 模拟器,但不允许明文 HTTP 流量

Ana*_*and 7 android firebase firebase-tools firebase-authentication

我有一个使用 Firebase 作为后端的 Flutter 应用程序。我使用 Firebase 模拟器在调试模式下测试我的应用程序。

为了允许物理设备连接到我在开发计算机上运行的模拟器,我更改了配置,以便模拟器在我的本地网络上使用该计算机的本地 IP 运行。(我通过 Dart 环境变量指定此 IP。)

firebase.json

{
  // ...
  "emulators": {
    "auth": {
      "host": "0.0.0.0",  // this is to avoid having to hard-code my local IP, which might change
      "port": 9099
    },
    "firestore": {
      "host": "0.0.0.0",
      "port": 8080
    },
    // ...
  }
}

Run Code Online (Sandbox Code Playgroud)

main.dart

if (kDebugMode) {
  const emulatorHost =
      String.fromEnvironment("EMULATOR_HOST", defaultValue: "localhost");
  FirebaseAuth.instance.useAuthEmulator(emulatorHost, 9099);
  FirebaseFirestore.instance.useFirestoreEmulator(emulatorHost, 8080);
}
Run Code Online (Sandbox Code Playgroud)

为了在我的应用程序上测试 Web 版本,我启动模拟器并通过 Android Studio 运行 Web 应用程序,所有这些都在同一个应用程序上进行。该应用程序能够与 Auth 模拟器进行通信,没有问题。

但是,当我在物理 Android 设备或 Android 模拟器上以调试模式运行应用程序时,每当它尝试与 Auth 模拟器通信(即在登录屏幕中,由 给出firebase_ui_auth)时,我都会收到以下错误:

com.google.firebase.FirebaseException: An internal error has occurred. [ Cleartext HTTP traffic to <my local ip> not permitted ]
Run Code Online (Sandbox Code Playgroud)

(奇怪的是,这只发生在 Auth 模拟器上,因为如果我绕过任何身份验证功能,Android 应用程序可以毫无问题地连接到 Firestore 模拟器。)

据我了解,这意味着应用程序正在尝试通过非加密的 HTTP 流量与模拟器进行通信,这是 Android 不允许的(对于此应用程序配置)。

我见过的建议解决方案(从 Flutter 应用程序连接到本地 Firebase 功能模拟器时出错不允许 Flutter 明文 HTTP 流量)都涉及删除此限制,或者通过允许应用程序范围内的明文 HTTP 流量

com.google.firebase.FirebaseException: An internal error has occurred. [ Cleartext HTTP traffic to <my local ip> not permitted ]
Run Code Online (Sandbox Code Playgroud)

或者只允许明文流量发送至模拟器运行的特定 IP

<application android:usesCleartextTraffic="true" />
Run Code Online (Sandbox Code Playgroud)

不想使用这些解决方案中的任何一个,因为我不想仅仅因为需要使用 Firebase 模拟器进行本地测试而启用明文 HTTP,并且我不想对我的本地 IP 进行硬编码,这可能会改变,在 Android xml 文件的某个地方。

有没有不存在这些问题的替代解决方案?例如,我可以让 SDK 通过 HTTPS 连接到模拟器吗?


作为临时解决方案/创可贴,目前我在应用程序范围内启用明文 HTTP,但仅适用于应用程序的调试风格,方法是将上述解决方案应用到 Android 清单,而android/app/src/debug不是android/app/src/main.