Firebase-tools: لم يتم تكريم مصادقة قناة WebChannel لمحاكي Firestore

تم إنشاؤها على ٢٨ أغسطس ٢٠١٩  ·  3تعليقات  ·  مصدر: firebase/firebase-tools

معلومات البيئة

أدوات Firebase: 7.30

النظام الأساسي: macOS 10.14.6

حالة اختبار

هدفي هو الحصول على طلبات محاكي firestore مصادق عليها تعمل محليًا في المستعرض. حالة الاستخدام المحددة للاختبار المحلي. لاختبار هذه الحالة ، قمت باستنساخ firebase / quickstart-nodejs repo وإضافة رمز مصادقة بسيط إلى نموذج firestore-emulator/browser-quickstart كما هو موضح في https://github.com/firebase/firebase-tools/issues/ 1001 # issuecomment -523319483.

راجع فرع webchannel-auth-issue للحصول على أدنى حالة اختبار توضح المشكلة (تم تضمين التغييرات في https://github.com/jkeys089/quickstart-nodejs/commit/a1456011525b0d40e5af14b38ca26898c6199151).

خطوات التكاثر

قم بتشغيل نموذج 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 كومينتر

لقد قضيت بعض الوقت في تصحيح هذه المشكلة وأعتقد أنني اكتشفت المشكلة. على الرغم من أن مصدر محاكي firestore غير متاح ، فقد تمكنت من إنشاء تصحيح يعمل على إصلاح هذا الخطأ / يسمح للطلبات المصادق عليها بالعمل كما هو متوقع:

--- 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 ما رأيك؟

عمل رائع :)

لما يستحق ، هذا مشابه جدًا للكود الذي تمت إضافته بالفعل للتعامل مع هذه الحالة. إذا قمت بالترقية إلى الإصدار 1.8.1 من محاكي Firestore (الذي تم شحنه مع الإصدار 7.3.0 من الحزمة firebase-tools ) ، فيجب إصلاح ذلك.

يرجى إعادة فتح هذه المشكلة إذا واجهت أي مشاكل أخرى ، وشكرًا مرة أخرى على الإبلاغ! : ابتسامة عريضة:

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات