firebase-tools: 7.30
Plataforma: macOS 10.14.6
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).
Ejecute la muestra firestore-emulator / browser-quickstart como de costumbre.
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).
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:
).
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:
Comentario más útil
@ jkeys089 ¡ Te
@ryanpbrewster o @IanWyszynski, ¿qué opinas?