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:
)時にブラウザ開発コンソールに複数のエラーが表示されます。
私は実際にこの問題のデバッグに時間を費やしましたが、問題を発見したと思います。 ファイヤーストアエミュレーターのソースは利用できませんが、このバグを修正するパッチを作成し、認証されたリクエストが期待どおりに機能するようにしました。
--- 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に付属)にアップグレードする場合、これを修正する必要があります。
他に問題が発生した場合は、この問題を再度開いてください。レポートをありがとうございます。 :ニヤリ:
最も参考になるコメント
@ jkeys089非オープンソースエミュレーターにパッチを提供すると、100インターネットポイントが付与されます。 これを本当に明確にしてくれてありがとう。
@ryanpbrewsterまたは@IanWyszynskiどう思いますか?