Firebase-tools: Autenticação do WebChannel do emulador Firestore não respeitada

Criado em 28 ago. 2019  ·  3Comentários  ·  Fonte: firebase/firebase-tools

Informação do ambiente

firebase-tools: 7.30

Plataforma: macOS 10.14.6

Caso de teste

Meu objetivo é fazer com que as solicitações do emulador Firestore autenticadas funcionem localmente em um navegador. O caso de uso específico é para teste local. Para testar este caso, clonei o firestore-emulator/browser-quickstart conforme descrito em https://github.com/firebase/firebase-tools/issues/ 1001 # issuecomment -523319483.

Consulte o branch webchannel-auth-issue para obter um caso de teste mínimo que demonstra o problema (as alterações estão contidas em https://github.com/jkeys089/quickstart-nodejs/commit/a1456011525b0d40e5af14b38ca26898c6199151).

Passos para reproduzir

Execute o exemplo firestore-emulator / browser-quickstart normalmente.

Comportamento esperado

O projeto de amostra deve funcionar normalmente (ou seja, permitir que o usuário insira texto na textarea, armazene-o no emulador firestore local e veja o texto mostrado com sucesso acima da textarea).

Comportamento real

Ao executar o projeto de amostra, vemos vários erros no console de desenvolvimento do navegador ao carregar a página ( Uncaught Error in onSnapshot: FirebaseError: ) e ao tentar postar texto ( Uncaught (in promise) FirebaseError: PERMISSION_DENIED: ).

emulator-suite firestore bug

Comentários muito úteis

@ jkeys089 Eu premio você com 100 pontos de internet por fornecer um patch para um emulador de código-fonte não aberto! Obrigado por deixar isso muito claro.

@ryanpbrewster ou @IanWyszynski o que você acha?

Todos 3 comentários

Na verdade, passei algum tempo depurando esse problema e acredito que descobri o problema. Embora a fonte do emulador Firestore não esteja disponível, consegui criar um patch que corrige esse bug / permite que as solicitações autenticadas funcionem conforme o esperado:

--- 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 Eu premio você com 100 pontos de internet por fornecer um patch para um emulador de código-fonte não aberto! Obrigado por deixar isso muito claro.

@ryanpbrewster ou @IanWyszynski o que você acha?

Trabalho impressionante :)

Pelo que vale a pena, isso é muito semelhante ao código que foi realmente adicionado para lidar com este caso. Se você atualizar para a v1.8.1 do emulador Firestore (que acompanha a v7.3.0 do pacote firebase-tools ), isso deve ser corrigido.

Reabra este problema se você encontrar qualquer outro problema e obrigado novamente pelo relatório! : sorrindo:

Esta página foi útil?
0 / 5 - 0 avaliações