Firebase-tools: FirestoreエミュレータのWebChannel認証が尊重されません

作成日 2019年08月28日  ·  3コメント  ·  ソース: firebase/firebase-tools

環境情報

firebase-tools: 7.30

プラットフォーム: macOS 10.14.6

テストケース

私の目標は、認証されたfirestoreエミュレーター要求をブラウザーでローカルに機能させることです。 特定の使用例は、ローカルテスト用です。 このケースをテストするために、 firebase / quickstart-nodejsリポジトリのクローンを作成し、 https://github.com/firebase/firebase-tools/issues/で説明されているように、単純なモック認証トークンをfirestore-emulator/browser-quickstartサンプルに追加しました。 1001#issuecomment- 523319483。

問題を示す最小限のテストケースについては、

再現する手順

通常どおり、 firestore-emulator / browser-quickstartサンプルを実行します。

予想される行動

サンプルプロジェクトは通常どおりに機能するはずです(つまり、ユーザーがテキストエリアにテキストを入力し、ローカルのfirestoreエミュレーターに保存して、テキストエリアの上にテキストが正常に表示されるようにします)。

実際の動作

サンプルプロジェクトを実行すると、ページの読み込み時( Uncaught Error in onSnapshot: FirebaseError: )とテキストの投稿( Uncaught (in promise) FirebaseError: PERMISSION_DENIED: )時にブラウザ開発コンソールに複数のエラーが表示されます。

emulator-suite firestore bug

最も参考になるコメント

@ jkeys089非オープンソースエミュレーターにパッチを提供すると、100インターネットポイントが付与されます。 これを本当に明確にしてくれてありがとう。

@ryanpbrewsterまたは@IanWyszynskiどう思いますか?

全てのコメント3件

私は実際にこの問題のデバッグに時間を費やしましたが、問題を発見した思います。 ファイヤーストアエミュレーターのソースは利用できませんが、このバグを修正するパッチを作成し、認証されたリクエストが期待どおりに機能するようにしました。

--- 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非オープンソースエミュレーターにパッチを提供すると、100インターネットポイントが付与されます。 これを本当に明確にしてくれてありがとう。

@ryanpbrewsterまたは@IanWyszynskiどう思いますか?

印象的な仕事:)

価値があるのは、このケースを処理するために実際に追加されたコードと非常によく似ています。 Firestoreエミュレーターのv1.8.1( firebase-toolsパッケージのv7.3.0に付属)にアップグレードする場合、これを修正する必要があります。

他に問題が発生した場合は、この問題を再度開いてください。レポートをありがとうございます。 :ニヤリ:

このページは役に立ちましたか?
0 / 5 - 0 評価