Firebase-tools: No se respeta la autenticación de WebChannel del emulador de Firestore

Creado en 28 ago. 2019  ·  3Comentarios  ·  Fuente: firebase/firebase-tools

Información medioambiental

firebase-tools: 7.30

Plataforma: macOS 10.14.6

Caso de prueba

Mi objetivo es conseguir que las solicitudes de emulador de firestore autenticadas funcionen localmente en un navegador. El caso de uso específico es para pruebas locales. Para probar este caso, cloné el firestore-emulator/browser-quickstart como se describe en https://github.com/firebase/firebase-tools/issues/ 1001 # comentario de emisión -523319483.

Consulte la rama webchannel-auth-issue para ver un caso de prueba mínimo que demuestra el problema (los cambios se encuentran en https://github.com/jkeys089/quickstart-nodejs/commit/a1456011525b0d40e5af14b38ca26898c6199151).

pasos para reproducir

Ejecute la muestra firestore-emulator / browser-quickstart como de costumbre.

Comportamiento esperado

El proyecto de muestra debería funcionar normalmente (es decir, permitir que el usuario ingrese texto en el área de texto, almacenarlo en el emulador local de Firestore y luego ver el texto que se muestra con éxito sobre el área de texto).

Comportamiento real

Al ejecutar el proyecto de muestra, vemos varios errores en la consola de desarrollo del navegador al cargar la página ( Uncaught Error in onSnapshot: FirebaseError: ) y al intentar publicar texto ( Uncaught (in promise) FirebaseError: PERMISSION_DENIED: ).

emulator-suite firestore bug

Comentario más útil

@ jkeys089 ¡ Te

@ryanpbrewster o @IanWyszynski, ¿qué opinas?

Todos 3 comentarios

De hecho, pasé algún tiempo depurando este problema y creo que lo he descubierto. Aunque la fuente del emulador firestore no está disponible, logré crear un parche que corrige este error / permite que las solicitudes autenticadas funcionen como se esperaba:

--- com/google/cloud/datastore/emulator/firestore/webchannel/FirestoreV1WebChannelAdapter.java    2019-08-28 00:42:06.000000000 -0400
+++ FirestoreV1WebChannelAdapter.java    2019-08-27 23:34:54.000000000 -0400
@@ -190,7 +190,17 @@
          String url = channel.getHandshakeHeaders().getUrl();
          QueryStringDecoder decoder = new QueryStringDecoder(url);
          String db = (String)((List)Preconditions.checkNotNull((List)decoder.parameters().get("database"), "expected %s to have a 'database' query parameter", (Object)url)).get(0);
-         Context.current().withValue(FirestoreEmulatorMetadataKeys.DATABASE_REF.contextKey(), db).run(() -> {
+         String auth = null;
+         if (decoder.parameters().get("$httpHeaders") != null) {
+            for (String rawHeader : decoder.parameters().get("$httpHeaders").get(0).split("\r\n")) {
+               if (rawHeader.startsWith("Authorization:")) {
+                  auth = rawHeader.substring(14).trim();
+                  break;
+               }
+            }
+         }
+         Context.current().withValue(FirestoreEmulatorMetadataKeys.AUTHORIZATION.contextKey(), auth).withValue(
+            FirestoreEmulatorMetadataKeys.DATABASE_REF.contextKey(), db).run(() -> {
             Object handler;
             if (url.startsWith("/google.firestore.v1.Firestore/Write/")) {
                handler = new FirestoreV1WebChannelAdapter.FirestoreWriteHandler(this.router, channel);

@ jkeys089 ¡ Te

@ryanpbrewster o @IanWyszynski, ¿qué opinas?

Impresionante trabajo :)

Por lo que vale, es muy similar al código que se agregó para manejar este caso. Si actualiza a v1.8.1 del emulador Firestore (que se envió con v7.3.0 del paquete firebase-tools ), esto debería solucionarse.

Vuelva a abrir este problema si encuentra otros problemas y gracias nuevamente por el informe. : sonriendo:

¿Fue útil esta página
0 / 5 - 0 calificaciones