Firebase-tools: وظائف Firebase Cloud: فشل التطبيق / بيانات اعتماد غير صالحة في جلب رمز وصول صالح لـ Google OAuth2 إلى Firebase Admin SDK

تم إنشاؤها على ٩ أكتوبر ٢٠١٩  ·  38تعليقات  ·  مصدر: firebase/firebase-tools

[مطلوب] معلومات البيئة


أدوات Firebase


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

[مطلوب] حالة الاختبار

[مطلوب] خطوات التكاثر

أنا جديد في وظائف السحابة. لقد اتبعت المستندات ، وبناء جملة التهيئة الجديد لـ firebase-admin ، لكنني أتلقى خطأ مصادقة عند تشغيل الوظيفة على الخادم وعلى مضيف محلي.

https://firebase.google.com/docs/functions/beta-v1-diff#new_initialization_syntax_for_firebase -admin

@firebase/database: FIREBASE WARNING: {"code":"app/invalid-credential","message":"Credential implementation provided to initializeApp() via the \"credential\" property failed to fetch a valid Google OAuth2 access token with the following error: \"Error fetching access token: Error while making request: getaddrinfo ENOTFOUND metadata.google.internal. Error code: ENOTFOUND\"."}

حاولت إنشاء مثيل sdk باستخدام serviceAccountKey ، نفس المشكلة. https://firebase.google.com/docs/admin/setup#initialize_the_sdk

يتم تشغيل الوظيفة على المضيف المحلي وعلى الخادم ، ويتم طرح الخطأ بمجرد إجراء الاستدعاء لقاعدة البيانات على gettingUser()

عند التشغيل محليًا بعد البناء:

$ firebase experimental:functions:shell
firebase > const data = {some_article...}
firebase > addingNewArticle(data)
'Successfully invoked function.'
firebase > >  New article created articleId1

DEBUG: @firebase/database: FIREBASE WARNING: {"code":"app/invalid-credential","message":"Credential implementation provided to initializeApp() via the \"credential\" property failed to fetch a valid Google OAuth2 access token with the following error: \"Error fetching access token: Error while making request: getaddrinfo ENOTFOUND metadata.google.internal. Error code: ENOTFOUND\"."}

/index.ts

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';

admin.initializeApp();

export const addingNewArticle = functions.database
.ref('/articles/{articleId}')
.onCreate(async (snapshot, context) => {
  const articleId = context.params.articleId

  const result = await gettingUser();
  console.log(`From onCreate ${result}`);


  console.log(`New article created ${articleId}`)

  const articleVal = snapshot.val()
  const name = articleVal.name
  const addedById = articleVal.addedById

  console.log(`${name} was added by: ${addedById}`);
  console.log(`burgersVal: ${articleVal}`);
  console.log(`snapshot: ${snapshot}`);


  return Promise.all([])
})


export async function gettingUser() {
    const result = await admin.database().ref(`users/fnkjasdfadsfna.d`).once('value');
    console.log(`Looging new user ${result.val()}`);
    return result.val()
}
functions functions

التعليق الأكثر فائدة

لأي شخص يواجه هذه المشكلة:

  • إذا كنت تشاهده في المحاكي ، فيمكنك إصلاحه إما عن طريق تعيين GOOGLE_APPLICATION_CREDENTIALS لحساب خدمة أو تشغيل gcloud auth application-default login على جهازك.
  • إذا كنت ترى هذا في الإنتاج ، فاتصل بدعم Firebase على الفور ، فلن يحدث هذا أبدًا.

ال 38 كومينتر

يبدو أن هذه المشكلة لا تتبع نموذج المشكلة. تأكد من تقديم جميع المعلومات المطلوبة.

talezion شكرا لتقديم هذا! فقط للتوضيح هل تريد استدعاء admin.database() لاستخدام قاعدة بيانات الإنتاج أم أنك تحاول استخدام محاكي قاعدة البيانات؟

مرحبًا samtstern ، صحيح ، أحاول الوصول إلى قاعدة بيانات الإنتاج من المحاكي. في الواقع ، أحصل على خطأ مصادقة مماثل عند تشغيل هذا على الخادم أيضًا.

هذا هو الخطأ الذي أحصل عليه على الخادم:

[2019-09-26T22:14:53.387Z]  @firebase/database: FIREBASE WARNING: Provided authentication credentials for the app named "[DEFAULT]" are invalid. This usually indicates your app was not initialized correctly. Make sure the "credential" property provided to initializeApp() is authorized to access the specified "databaseURL" and is from the correct project. 

talezion هاه حتى ترى هذا مع وظائف السحابة المنشورة أيضًا؟ هل تقوم بالتهيئة في أي مكان غير admin.initializeApp(); ؟ يجب أن يستخدم ذلك بيانات الاعتماد الافتراضية للتطبيق.

حسنًا ، لقد قمت بعمل وظيفة بسيطة لإظهار بيانات الاعتماد الخاصة بي:

const app = admin.initializeApp();

exports.helloWorld = functions.https.onRequest((request, response) => {
 response.json(app.options);
});

عندما أسميها محليًا ، أحصل على شيء مثل هذا:

{
    "credential": {
        "credential_": {
            "httpClient": {
                "retry": {
                    "backOffFactor": 0.5,
                    "ioErrorCodes": [
                        "ECONNRESET",
                        "ETIMEDOUT"
                    ],
                    "maxDelayInMillis": 60000,
                    "maxRetries": 4,
                    "statusCodes": [
                        503
                    ]
                }
            },
            "refreshToken": {
                "clientId": "764086051850-6qr4p6gpi6hn506pt8ejuq83di341hur.apps.googleusercontent.com",
                "clientSecret": "REDACTED",
                "refreshToken": "REDACTED",
                "type": "authorized_user"
            }
        }
    },
    "databaseURL": "https://fir-dumpster.firebaseio.com",
    "projectId": "fir-dumpster",
    "storageBucket": "fir-dumpster.appspot.com"
}

talezion هل يمكنك أن تفعل الشيء نفسه وأن تريني الإخراج؟ تأكد من إخفاء عميلك سرًا وتحديثًا كما فعلت أنا ، من الخطورة مشاركتها.

samtstern لقد قمت admin.initializeApp(); . لقد جربت أيضًا طرقًا مختلفة كما هو موضح في https://firebase.google.com/docs/admin/setup#initialize_the_sdk أو باستخدام serviceAccountKey.json بدون حظ.

شكرا لك على المثال الخاص بك. يرجى الاطلاع أدناه الإخراج:

firebase > helloWorld()
Sent request to function.
firebase > 
RESPONSE RECEIVED FROM FUNCTION: 200, {
  "databaseURL": "https://<PROJECT-ID>.firebaseio.com",
  "storageBucket": "<PROJECT-ID>.appspot.com",
  "projectId": "<PROJECT-ID>",
  "credential": {
    "credential_": {
      "httpClient": {
        "retry": {
          "maxRetries": 4,
          "statusCodes": [
            503
          ],
          "ioErrorCodes": [
            "ECONNRESET",
            "ETIMEDOUT"
          ],
          "backOffFactor": 0.5,
          "maxDelayInMillis": 60000
        }
      }
    }
  }
}

talezion طيب شيئين ؛

1) هل قال حرفياً <PROJECT-ID> أم أن هذا هو التنقيح الخاص بك؟
2) هاه غريب جدًا أنه لا يحتوي على refreshToken ... سأضطر إلى معرفة كيف يكون ذلك ممكنًا.

تضمين التغريدة

  1. لا ، لقد استبدلت للتو <PROJECT-ID> بمعرف المشروع الذي كان صحيحًا.
  2. شكرا!

حسنًا ، أعتقد أن الاستجابة في الإنتاج أمر طبيعي ، لكن محليًا أتوقع المزيد.

شيئين الآن:
1) هل لديك مجموعة متغير البيئة GOOGLE_APPLICATION_CREDENTIALS ؟
2) هل يمكنك محاولة تشغيل firebase logout و firebase login مرة أخرى ومعرفة ما إذا كان ذلك يجعله يعمل بشكل أفضل محليًا؟

تضمين التغريدة

  1. نعم ، حاولت ضبط:
    set GOOGLE_APPLICATION_CREDENTIALS="/functions/src/serviceAccountKey.json" .
    ثم تشغيل قذيفة
  2. نعم ، حاولت تسجيل الخروج وتسجيل الدخول مرة أخرى ، لا تزال نفس المشكلة

talezion حسنًا شكرًا على التأكيد. لأكون صادقًا ، أشعر بالحيرة تمامًا في الوقت الحالي ، لكنني سأستمر في التفكير في هذا الأمر.

شكرًا samtstern ، لقد حاولت اختباره على مشروع جديد تمامًا وهو يعمل.

  1. إنشاء مشروع جديد
  2. وظائف الحرف الأول
  3. نفذ نفس الكود

أنه يعمل بشكل جيد.

بصرف النظر عن إنشاء مشروع جديد ، قمت بحذف مشروع وظائف جديد وبدأت فيه ، ونشرت نفس الكود. هذا هو الخطأ الذي أحصل عليه:

@firebase/database: FIREBASE WARNING: Provided authentication credentials for the app named "[DEFAULT]" are invalid. This usually indicates your app was not initialized correctly. Make sure the "credential" property provided to initializeApp() is authorized to access the specified "databaseURL" and is from the correct project. 

تم إنشاء المشروع القديم في يناير من هذا العام ، فهل هناك أي شيء يجب القيام به على وحدة التحكم؟

لدي نفس المشكلة. هذا هو الدليل الخاص بي:
1.- بدء المشروع والوظائف ، كل شيء يعمل بشكل جيد.
2.- أرسل إلى GitHub وافتحه في كمبيوتر آخر ، وقم بتثبيت NPM ، والصور الثابتة تعمل بشكل جيد. لقد عملت في هذا الكمبيوتر طوال الليل ، أقوم بإجراء دفع ولكن لا يزال يعمل بشكل جيد.
3.- العودة إلى أول جهاز كمبيوتر يقوم بالسحب ، ثم يتعطل.
4.- اختبار في الكمبيوتر الثاني ، لا يزال يعمل بشكل جيد.

كما ترى ، لدي نفس الرمز في جهازي كمبيوتر ، في أحدهما يتعطل بعد تقديم طلب سحب.

قالت رسالة وحدة التحكم إنها مشكلة في الاعتماد ، لقد حاولت ذلك دون نجاح:

  • إعادة تعيين تسجيل الدخول الخاص بي في Firebase في المحطة
  • محو تكوين قواعد قاعدة البيانات في الملف المحلي
  • أستخدم أوراق اعتماد الوظائف ، وأقوم بتغييرها لمشروع التكوين
  • قم بتثبيت أدوات firebase في مشروع مجلد node_modules

سأعيد تشغيل المشروع الفارغ.

بعد الترقية إلى Mac OS Catalina واجهت هذه المشكلة. ما حل المشكلة بالنسبة لي هو تشغيل الأوامر التالية:

  • firebase login
  • export GOOGLE_APPLICATION_CREDENTIALS="<PATH_TO_YOUR_SERVICE_ACCOUNT_KEY_JSON>"

هل يوجد حل منشور في مكان ما؟ أتلقى هذا التحذير اليوم عند محاولة الوصول إلى قاعدة بيانات من خلال وظيفة سحابية تعمل محليًا.

لدي نفس المشكلة بالضبط ، لأن حياتي لا تستطيع معرفة ما يحدث. لقد جربت عدة حسابات jsons للخدمة ، وأعدت ضبط مشروعي عدة مرات ، وأعدت التشغيل ، وتسجيل الدخول والخروج ، وإعادة تعيين المتغير GOOGLE_APPLICATION_CREDENTIALS وحتى تبديل نظام التشغيل.
اعتقدت أنه قد يكون مشكلة في جهاز windows الخاص بي لأنه من هناك لا يمكنني حتى بدء تشغيل المحاكي لأنه يقول إنه يفتقر إلى رمز التحديث ،
Error: Failed to parse refresh token file: Error: Refresh token must contain a "client_secret" property.

لذلك أجريت تثبيتًا نظيفًا لنظام Linux وأعدت المشروع. في المرة الأولى التي عملت فيها بشكل جيد بعد إعداد حساب الخدمة ، ولكن بعد إعادة تشغيل جهاز Linux ، واجهت نفس المشكلة مرة أخرى.
Credential implementation provided to initializeApp() via the "credential" property failed to fetch a valid Google OAuth2 access token with the following error: "Error fetching access token: Error while making request: getaddrinfo ENOTFOUND metadata.google.internal. Error code: ENOTFOUND".

فيما يلي خياراتي من وظيفة السحابة:

{
    "credential": {
        "credential_": {
            "httpClient": {
                "retry": {
                    "maxRetries": 4,
                    "statusCodes": [
                        503
                    ],
                    "ioErrorCodes": [
                        "ECONNRESET",
                        "ETIMEDOUT"
                    ],
                    "backOffFactor": 0.5,
                    "maxDelayInMillis": 60000
                }
            }
        }
    },
    "databaseURL": "https://REDACTED.firebaseio.com"
}

تمت التهيئة باستخدام:

admin.initializeApp({
  credential: admin.credential.applicationDefault(),
  databaseURL: 'https://REDACTED.firebaseio.com'
});

نفس المشكلة هنا! على سطح مكتب Linux الخاص بي يعمل بشكل جيد. منتشر على مخرجات EKS (جبال الألب) بلا حدود:

[2019-12-20T20: 28: 27.137Z] @ firebase / database: FIREBASE WARNING: {"code": "app / غير صالح-بيانات الاعتماد" ، "message": "تم توفير تنفيذ بيانات الاعتماد لـ initializeApp () عبر بيانات الاعتماد \" \ "فشلت الخاصية في جلب رمز دخول Google OAuth2 صالح مع الخطأ التالي: \" خطأ في جلب رمز الدخول: غير صالح_غرانت (مُصدر غير صالح: ليس حساب خدمة.) \ ". هناك سببان محتملان: (1) وقت الخادم لم تتم مزامنتها بشكل صحيح أو (2) تم إبطال ملف مفتاح الشهادة الخاص بك. لحل (1) ، أعد مزامنة الوقت على الخادم الخاص بك. لحل (2) ، تأكد من أن معرّف المفتاح لملف المفتاح الخاص بك لا يزال موجودًا في https://console.firebase.google.com/iam-admin/serviceaccounts/project. إذا لم يكن الأمر كذلك ، فأنشئ ملف مفتاح جديدًا على https://console.firebase.google.com/project/_/settings/serviceaccounts/adminsdk . "}

تم إنشاء مفتاح جديد ويعمل محليًا بشكل جيد ولكن ليس مرة أخرى عند نشره على السحابة.

من فضلك ، هل قام أحد بإصلاح هذا؟

نفس الشيء بالنسبة لي
[2019-12-21T11:21:35.790Z] @firebase/database: FIREBASE WARNING: {"code":"app/invalid-credential","message":"Credential implementation provided to initializeApp() via the \"credential\" property failed to fetch a valid Google OAuth2 access token with the following error: \"Error fetching access token: <html>\r\n<head><title>302 Found</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>302 Found</h1></center>\r\n<hr><center>nginx/1.14.2</center>\r\n</body>\r\n</html>\r\n\"."}

نفس مشكلة المؤلف:

لقد اتبعت هذا المرجع لتهيئة تطبيقي:

admin.initializeApp({ credential: admin.credential.applicationDefault(), ... })

(في الواقع ، يؤدي حذف credential بالكامل إلى نفس النتيجة تمامًا) ، والفشل مع الخطأ التالي عند التشغيل على الجهاز المحلي (ليس في السحابة):

خطأ: فشل تنفيذ بيانات الاعتماد المقدم إلى initializeApp () عبر خاصية "بيانات الاعتماد" في جلب رمز وصول Google OAuth2 صالح مع الخطأ التالي: "خطأ في جلب رمز الدخول: خطأ أثناء تقديم الطلب: getaddrinfo ENOTFOUND metadata.google.internal. رمز الخطأ : ENOTFOUND "

(من المضحك أن المشكلة تتعلق بـ firebase-admin ، لكن هذه هي أول نتيجة على Google ، لذلك اعتقدت أنني سأشارك في الحفلة ...)

metadata.google.internal؟

هذا هو الجزء الأكثر غرابة: إنه يحاول الحصول على رمز مميز من نطاق metadata.google.internal يبدو أنه لا يمكن أن يعمل إلا في وظيفة Google Cloud؟ هل التنمية المحلية غير مدعومة بعد الآن؟

اما الطريقة؛ لقد قمت بتصحيح الأخطاء قليلاً ، ووجدت أنه يحدث في node_modules/firebase-admin/lib/auth/credential.js

الذي يحتوي على دهون كبيرة:

var GOOGLE_METADATA_SERVICE_HOST = 'metadata.google.internal';

[ هنا رابط المصدر ]

samtstern أي تحديثات؟ لماذا يحاول الحصول على رموز من عنوان داخلي للجميع؟

أرى هذا أيضًا أثناء عدم تسجيل الدخول ، وعدم استخدام GOOGLE_APPLICATION_CREDENTIALS . أرى أنه يحدث عند تشغيل firebase functions:shell ثم استدعاء مشغل قاعدة بيانات onWrite لقاعدة بيانات Realtime. يعود المشغل فارغًا فقط ولا يفعل أي شيء آخر.

>  [2020-01-17T20:00:30.997Z]  @firebase/database: FIREBASE WARNING: {"code":"app/invalid-credential","message":"Credential implementation provided to initializeApp() via the \"credential\" property failed to fetch a valid Google OAuth2 access token with the following error: \"Error fetching access token: Error while making request: getaddrinfo ENOTFOUND metadata.google.internal. Error code: ENOTFOUND\"."}

نفس المشكلة هنا ، لا تزال دون حل.

نفس المشكلة كذلك

رسالة الخطأ مشفرة ، لكن الإصلاح (على الأقل في حالتي) كان بسيطًا. كما أشار @ hiranya911 في هذه المشكلة ذات الصلة ، يحدث الخطأ إذا لم يتم إعداد متغيرات التكوين / البيئة بشكل صحيح ، فأنت تريد التحقق مرة أخرى من GOOGLE_APPLICATION_CREDENTIALS وجه التحديد.

لأي شخص يواجه هذه المشكلة:

  • إذا كنت تشاهده في المحاكي ، فيمكنك إصلاحه إما عن طريق تعيين GOOGLE_APPLICATION_CREDENTIALS لحساب خدمة أو تشغيل gcloud auth application-default login على جهازك.
  • إذا كنت ترى هذا في الإنتاج ، فاتصل بدعم Firebase على الفور ، فلن يحدث هذا أبدًا.

لأي شخص يواجه هذه المشكلة:

  • إذا كنت تشاهده في المحاكي ، فيمكنك إصلاحه إما عن طريق تعيين GOOGLE_APPLICATION_CREDENTIALS لحساب خدمة أو تشغيل gcloud auth application-default login على جهازك.
  • إذا كنت ترى هذا في الإنتاج ، فاتصل بدعم Firebase على الفور ، فلن يحدث هذا أبدًا.

نفس المشكلة هنا ، ولكن تم حلها بحلsamtstern !! شكرا لك.

شكرا لكsamtstern. واجهت هذه المشكلة بسبب حسابات Google المتعددة. تم استخدام أحدهما على Firebase CLI ، وتم تسجيل دخول آخر إلى Google Cloud CLI ... أدت إعادة تسجيل الدخول إلى كليهما بنفس الحساب إلى حل المشكلة.
🙌

يمكن أن يؤكد أن حل samtstern الخاص بتعيين GOOGLE_APPLICATION_CREDENTIALS نجح معي.

أواجه مشكلة في استخدام محاكي الوظائف مع قاعدة بيانات الوقت الفعلي (الحقيقية على الإنترنت ولا يتم محاكاتها إذا كان ذلك ممكنًا).

[2020-03-15T23:36:45.803Z]  @firebase/database: FIREBASE WARNING: {"code":"app/invalid-credential","message":"Credential implementation provided to initializeApp() via the \"credential\" property failed to fetch a valid Google OAuth2 access token with the following error: \"Error fetching access token: Error while making request: getaddrinfo ENOTFOUND metadata.google.internal metadata.google.internal:80. Error code: ENOTFOUND\"."}

لقد حاولت ضبط المتغير export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/[FILE_NAME].json" كما في
https://cloud.google.com/docs/authentication/getting-started
حاول كل من الإشارة إلى defaultAccount.json و serviceAccount.json .

ما الذي يمكن أن أفعله خطأ؟

كنت أواجه مشكلة أيضًا (نفس الخطأ Error code: ENOTFOUND\"." ) ... حتى عند استخدام حل samtstern ... لذلك ، قمت بدمج الحلين ؛ يتمثل أحد الأجزاء في إنشاء json.key من وحدة تحكم Google السحابية وجزء واحد من إجابة StackOverflow هذه .

الجزء الأول (وحدة تحكم جوجل كلاود):

  • حدد المشروع المطلوب من خلال النقر على زر "تحديد مشروع" في الجزء العلوي من الشاشة
  • أنشئ مفتاحًا بالانتقال إلى قائمة "النقاط الثلاث" في الصف حيث تظهر أسفل "الاسم" عبارة "حساب خدمة App Engine الافتراضي"
  • سيؤدي هذا إلى تنزيل ملف مفتاح __your_app_sth__.json

الجزء الثاني (SO الإجابة):

  • انتقل إلى index.json حيث توجد وظائفك ، وعند admin.initializeApp() ضع البيانات من الملف الذي تم إنشاؤه .json كما هو منسق في إجابة StackOveflow.

هتافات!

إليك كيف تمكنت من حل المشكلة:

رسالة خطأ:

خطأ: فشل تنفيذ بيانات الاعتماد المقدم إلى initializeApp () عبر خاصية "بيانات الاعتماد" في جلب رمز وصول صالح لـ Google OAuth2 مع ظهور الخطأ التالي: "خطأ في جلب رمز الدخول: غير صالح (طلب غير صالح)". هناك سببان محتملان: (1) لم تتم مزامنة وقت الخادم بشكل صحيح أو (2) تم إبطال ملف مفتاح الشهادة. لحل المشكلة (1) ، أعد مزامنة الوقت على خادمك. لحل (2) ، تأكد من أن معرف المفتاح لملف المفتاح الخاص بك لا يزال موجودًا على https://console.firebase.google.com/iam-admin/serviceaccounts/project. إذا لم يكن الأمر كذلك ، فقم بإنشاء ملف مفتاح جديد على https://console.firebase.google.com/project/_/settings/serviceaccounts/adminsdk.

الحل :

الخطوة 1: مزامنة الوقت للكمبيوتر المحلي مع خادم الوقت. كان هناك اختلاف بمقدار ثانية واحدة في حالتي ، لكن Windows 10 يحتوي على زر SYNC NOW واستخدمه ومزامنة الوقت. تحقق منه على: https://time.is/

الخطوة 2: انتقل إلى الرابط https://console.firebase.google.com/project/_/settings/serviceaccounts/adminsdk أعلاه. قم بإنشاء مفتاح خاص هناك. احفظه في مجلد على جهاز الكمبيوتر الخاص بك. قل "D: \ Path \ project-101-firebase-adminsdk-cb748-fhry6shja.json". ثم في ملف index.ts الخاص بمجلد الوظائف ، قم بتحديث الكود كما يلي:

"
استيراد * كوظائف من "وظائف Firebase" ؛
استيراد * كمسؤول من "firebase-admin" ؛

var serviceAccount = يتطلب ("D: //Path//project-101-firebase-adminsdk-cb748-fhry6shja.json") ؛
admin.initializeApp ({
بيانات الاعتماد: admin.credential.cert (serviceAccount) ،
databaseURL: "https://project-101.firebaseio.com"
}) ؛
"

خطوة اختيارية: (لست متأكدًا مما إذا كان هذا لا يزال مطلوبًا) - يمكننا تعيين GOOGLE_APPLICATION_CREDENTIALS على جهاز الكمبيوتر على النحو التالي:

set GOOGLE_APPLICATION_CREDENTIALS="D:\Path\project-101-firebase-adminsdk-cb748-fhry6shja.json"

اختبر أنه تم إجراؤه بشكل صحيح باستخدام - اضبط GOOGLE_APPLICATION_CREDENTIALS


أخيرًا لاختبار تشغيل وظائف السحابة على المحاكي ، اتبعت هذا المقال المكتوب جيدًا:
https://medium.com/@moki298/test-your-firebase-cloud-function-local-using-cloud-function-shell-32c821f8a5ce

في الأساس -

  1. افتح CMD في وضع المسؤول ، وانتقل إلى مجلد الوظائف.
  2. قم بتشغيل الأمر transpile لملف ts الخاص بالوظيفة. سيكون هذا مطلوبًا في كل مرة نقوم فيها بإجراء تغيير في التعليمات البرمجية الخاصة بنا.

npm run-script build

  1. أدخل غلاف وظائف Firebase بالأمر:

firebase functions:shell

  1. قم بتشغيل وظيفتك وتأكد من أنها تعمل بشكل جيد (نأمل!). لنفترض أن الوظيفة هي دالة سحابة http بالاسم TestFunc - لذلك في نوع shell الخاص بالوظائف:

TestFunc()

يجب أن تفعل ذلك.

انتقل إلى الرابط https://console.firebase.google.com/project/_/settings/serviceaccounts/adminsdk أعلاه. قم بإنشاء مفتاح خاص هناك. احفظه في مجلد على جهاز الكمبيوتر الخاص بك. قل "D: \ Path \ project-101-firebase-adminsdk-cb748-fhry6shja.json". ثم في ملف index.ts الخاص بمجلد الوظائف ، قم بتحديث الكود كما يلي:

"
استيراد * كوظائف من "وظائف Firebase" ؛
استيراد * كمسؤول من "firebase-admin" ؛

var serviceAccount = يتطلب ("D: //Path//project-101-firebase-adminsdk-cb748-fhry6shja.json") ؛
admin.initializeApp ({
بيانات الاعتماد: admin.credential.cert (serviceAccount) ،
databaseURL: "https://project-101.firebaseio.com"
}) ؛
"

تضمين التغريدة

بالنسبة لأي شخص يرى هذا ، ما عليك سوى وضع ملف json الذي تم تنزيله في دليل المستودع /functions الخاص بك ، واستيراده مثل
const credential = require("./credentails.json") .
يمكنك إعادة تسمية json إلى شيء مثل "credentails.json" حتى يسهل عليك فهم ملفاتك.

⚠️ تحذير: لا يجب عليك الالتزام بهذا النوع من الملفات. إنها حساسة للغاية. استبعده من الالتزامات بإضافة اسمه في functions/.gitignore .

لقد انتهيت

gcloud auth application-default login
تم فتح المستعرض الخاص بك لزيارة:

ونجحت ولكن احصل على

users.js:60 Error listing users: Error: //cloud.google.com/docs/authentication/. Raw server response: "{"error":{"code":403,"message":"Your application has authenticated using end user credentials from the Google Cloud SDK or Google Cloud Shell which are not supported by the identitytoolkit.googleapis.com. We recommend configuring the billing/quota_project setting in gcloud or using a service account through the auth/impersonate_service_account setting. For more information about service accounts and how to use them in your application, see https://cloud.google.com/docs/authentication/.","errors":[{"message":"Your application has authenticated using end user credentials from the Google Cloud SDK or Google Cloud Shell which are not supported by the identitytoolkit.googleapis.com. We recommend configuring the billing/quota_project setting in gcloud or using a service account through the auth/impersonate_service_account setting. For more information about service accounts and how to use them in your application, see https://cloud.google.com/docs/authentication/.","domain":"usageLimits","reason":"accessNotConfigured","extendedHelp":"https://console.developers.google.com"}],"status":"PERMISSION_DENIED"}}"

لقد جربت هذا أيضًا:

قم بتنزيل ملف المسؤول وقم بالتصدير كما هو الحال في bash:
export GOOGLE_APPLICATION_CREDENTIALS="$HOME/svelte-fullstack-starter-firebase-adminsdk-4bq35-xxxx.json"

ولكن عند تشغيل المحاكي أحصل على نفس المشكلة المذكورة أعلاه
image

quantuminformation عندما تفعل gcloud auth application-default login تحصل على بيانات اعتماد المستخدم ( firebase logini هو نفس نوع بيانات الاعتماد). بعض واجهات برمجة التطبيقات ، مثل identitytoolkit API التي تشغل Firebase Auth ، لا تقبل بيانات الاعتماد هذه.

إذا كنت ترغب في استخدام واجهات برمجة التطبيقات هذه ، فيجب عليك استخدام حساب خدمة للمصادقة. قم بتعيين متغير البيئة GOOGLE_APPLICATION_CREDENTIALS للإشارة إلى ملف JSON للمفتاح الخاص لحساب الخدمة:
https://cloud.google.com/docs/authentication/getting-started#setting_the_environment_variable


تحرير أرى أنك فعلت هذا بالفعل. إذا كنت تستخدم env var وكان المحاكي لا يحترم بيانات اعتمادك ، فيجب عليك تقديم مشكلة جديدة.

قمت بالترقية إلى
8.4.3 وعملت بشكل جيد

نظام التشغيل Mac OS

[مطلوب] حالة الاختبار

كود الوظائف: https://github.com/quantuminformation/svelte-firebase-starter/tree/master/functions

[مطلوب] خطوات التكاثر

  • تشغيل gcloud auth application-default login في الدر أعلاه

يقوم بإنشاء ملف Credentials saved to file: [/Users/nikos/.config/gcloud/application_default_credentials.json]
لمسة جديدة لطيفة)

  • ثم أقوم بإزالة القائمة الخاصة بي
    تم تعيين متغير البيئة [GOOGLE_APPLICATION_CREDENTIALS] على:
    [/ Users / nikos / svelte-fullstack-starter-firebase-adminsdk-4bq35-f77b2
    b4fc4.json]

وهذا خلق:
image

  • أخيرًا ، قمت بتشغيل firebase emulators:start --only functions --inspect-functions

image

عندما أقوم بتشغيل تطبيقي مشيرًا إلى محاكاة محلية
base = "http://localhost:5002/svelte-fullstack-starter/us-central1"

تصحيح الأخطاء يعمل بشكل جيد باستخدام بياناتي الحية!

بالنسبة لحالتي ، قم بمزامنة الوقت على جهاز الكمبيوتر / الكمبيوتر المحمول المحلي مع خادم الوقت الذي حل المشكلة ، شكرًا! تضمين التغريدة

مرحبا جميعا. يتضمن الإصدار 8.5.0 من CLI هذا التغيير:
https://github.com/firebase/firebase-tools/pull/2214

مع هذا التغيير ، لن تحتاج بعد الآن إلى تشغيل gcloud auth application-default login لاستخدام المحاكيات (على الرغم من أنك تستطيع ذلك إذا كنت ترغب في ذلك). طالما قمت بتسجيل الدخول باستخدام firebase login فسوف نقوم بتمرير بيانات اعتماد المستخدم الخاصة بك إلى محاكي الوظائف.

لذلك أعتقد أنه يجب حل هذه المشكلة الآن. إذا كان لديك سلوك مصادقة آخر غير متوقع ، يرجى تقديم مشكلة جديدة والإشارة إلي!

هل تحتاج إلى إنشاء قاعدة Firebase الخاصة بمسؤول SDK في مشروعك.

الوصول إلى "الإعدادات"> "حساب الخدمات" وإنشاء قاعدة Firebase الخاصة بمسؤول SDK

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