Firebase-tools: Firestore-Emulator WebChannel-Authentifizierung nicht berücksichtigt

Erstellt am 28. Aug. 2019  ·  3Kommentare  ·  Quelle: firebase/firebase-tools

Umweltinfos

Firebase-Tools: 7.30

Plattform: macOS 10.14.6

Testfall

Mein Ziel ist es, authentifizierte Firestore-Emulatoranforderungen zu erhalten, die lokal in einem Browser funktionieren. Der spezifische Anwendungsfall ist für lokale Tests. Um diesen Fall zu testen, habe ich das Firebase/quickstart-nodejs-Repository geklont und dem firestore-emulator/browser-quickstart Beispiel ein einfaches Mock -Authentifizierungstoken hinzugefügt, wie in https://github.com/firebase/firebase-tools/issues/ beschrieben. 1001#issuecomment -523319483.

Im Zweig webchannel-auth-issue finden Sie einen minimalen Testfall, der das Problem demonstriert (Änderungen sind in https://github.com/jkeys089/quickstart-nodejs/commit/a1456011525b0d40e5af14b38ca26898c6199151 enthalten).

Schritte zum Reproduzieren

Führen Sie das Firestore-Emulator/Browser-Quickstart- Beispiel wie

Erwartetes Verhalten

Das Beispielprojekt sollte normal funktionieren (dh dem Benutzer erlauben, Text in den Textbereich einzugeben, ihn im lokalen Firestore-Emulator zu speichern und dann den Text erfolgreich über dem Textbereich anzuzeigen).

Tatsächliches Verhalten

Beim Ausführen des Beispielprojekts sehen wir mehrere Fehler in der Browser-Entwicklungskonsole beim Laden der Seite ( Uncaught Error in onSnapshot: FirebaseError: ) und beim Versuch, Text zu posten ( Uncaught (in promise) FirebaseError: PERMISSION_DENIED: ).

emulator-suite firestore bug

Hilfreichster Kommentar

@jkeys089 Ich

@ryanpbrewster oder @IanWyszynski was denkst du?

Alle 3 Kommentare

Ich habe tatsächlich einige Zeit damit verbracht, dieses Problem zu debuggen, und ich glaube, ich habe das Problem entdeckt. Obwohl die Quelle für den Firestore-Emulator nicht verfügbar ist, ist es mir gelungen, einen Patch zu erstellen, der diesen Fehler behebt / authentifizierte Anfragen wie erwartet funktionieren lässt:

--- 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 Ich

@ryanpbrewster oder @IanWyszynski was denkst du?

Beeindruckende Arbeit :)

Das ist dem Code, der tatsächlich hinzugefügt wurde, um diesen Fall zu behandeln, sehr ähnlich. Wenn Sie auf v1.8.1 des Firestore-Emulators aktualisieren (der mit v7.3.0 des firebase-tools Pakets geliefert wurde), sollte dies behoben sein.

Bitte öffnen Sie dieses Problem erneut, wenn Sie auf andere Probleme stoßen, und nochmals vielen Dank für den Bericht! :grins:

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen