Firebase-tools: "خطأ: لا يحتوي كائن JSON الوارد على حقل client_email" بعد الترقية إلى 7.0.2

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

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


أدوات Firebase


النظام الأساسي: Oracle Linux Server 7.6 ، Node 10.15

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


محاكاة وظيفة https باستخدام "firebase-admin": "^ 8.2.0"، "وظائف firebase": "^ 3.0.2"

[مطلوب] خطوات إعادة الإنتاج

قم بتشغيل أي وظيفة https مع وظائف firebase

[مطلوب] السلوك المتوقع

لا يوجد خطأ (لا يُلقي Firebase-tools 7.0.0 أي خطأ)

[مطلوب] السلوك الفعلي

أرسل الطلب للعمل.

firebase > ⚠  Error: The incoming JSON object does not contain a client_email field
    at JWT.fromJSON (/riderequest/functions/node_modules/google-auth-library/build/src/auth/jwtclient.js:165:19)
    at GoogleAuth.fromJSON (/riderequest/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:294:16)
    at GoogleAuth.getClient (/riderequest/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:476:52)
    at GrpcClient._getCredentials (/riderequest/functions/node_modules/google-gax/build/src/grpc.js:107:40)
    at GrpcClient.createStub (/riderequest/functions/node_modules/google-gax/build/src/grpc.js:223:34)
    at new FirestoreClient (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/v1/firestore_client.js:128:39)
    at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/index.js:315:26)
    at ClientPool.acquire (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/pool.js:61:35)
    at ClientPool.run (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/pool.js:114:29)
    at Firestore.request (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/index.js:957:33)
⚠  Your function was killed because it raised an unhandled error.
emulator-suite functions bug

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

_ إخلاء المسؤولية: لست متأكدًا من مدى ارتباط مشكلتي بهذه المشكلة هنا ، ولكن على الأقل يمكنني ترك معلوماتي هنا لأنها قد تساعد بعضًا منكم.

كان لدي نفس الشيء في وظيفة Firebase التي تحاول تحديث بعض المستندات في قاعدة بيانات firestore دفعة واحدة. (لم تختبر بدون دفعة).

هذا هو Callstack:

Unhandled error Error: The incoming JSON object does not contain a client_email field
>      at JWT.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\jwtclient.js:165:19)
>      at GoogleAuth.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:294:16)
>      at GoogleAuth.getClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:476:52)
>      at GrpcClient._getCredentials (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:107:40)
>      at GrpcClient.createStub (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:223:34)
>      at new FirestoreClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\v1\firestore_client.js:128:39)
>      at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:315:26)
>      at ClientPool.acquire (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:61:35)
>      at ClientPool.run (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:114:29)
>      at Firestore.readStream (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:995:26)

RESPONSE RECEIVED FROM FUNCTION: 500, {
  "error": {
    "status": "INTERNAL",
    "message": "INTERNAL"
  }
}

كنت أقوم بتشغيل وظيفتي محليًا باستخدام سطر الأوامر:
firebase functions:shell

كنت أستخدم هذا الرمز:

// Reference report in Firestore
const db = admin.firestore();

admin.initializeApp();

export const performMyCallableFirebaseFunction = (db,, { from, to }) => {
    return db.collection("collectionName").where("prop", "==", from).limit(500).get().then(snapshot => {
        if (snapshot.empty) return new Promise(resolve => resolve(`No docs found with prop: ${from}`));

        const batch = db.batch();
        snapshot.forEach(doc => batch.update(doc.ref, { prop: to }));

        return batch.commit();
    });
};
exports.myCallableFirebaseFunction = functions.https.onCall(data => performMyCallableFirebaseFunction(db, data.from, data.to));

لقد غيرت الخط
admin.initializeApp();
إلى
admin.initializeApp({ credential: admin.credential.applicationDefault() });
والآن تمكنت من الاتصال بوظيفتي محليًا باستخدام:

firebase functions:shell
firebase > myCallableFirebaseFunction({from: "foo", to: "bar"})

راجع المستندات لـ admin.credential.applicationDefault ()

ال 61 كومينتر

noelmansour شكرًا لذلك يبدو أن شيئًا ما بين 7.0.1 و 7.0.2 تسبب في هذا ، سألقي نظرة على التغييرات التي تم إجراؤها.

أواجه هذه المشكلة أيضًا منذ 7.0.2

قمت بالترقية إلى 7.0.2 ، ورؤية هذا أيضًا. فحص بيانات اعتماد حسابي وحقل client_email موجود.

هل يمكن لشخص ما مشاركة رمز وظيفة يحاول تشغيلها في المحاكي الذي فشل بسبب هذا الخطأ؟ أبسط كان ذلك أفضل.

samtstern أخفق الكود التالي بالنسبة لي:

import * as admin from 'firebase-admin';
admin.initializeApp();

import * as functions from 'firebase-functions';

export const testFunction = functions.https.onRequest(async (req, res) => {
  const request = await admin.firestore().doc('test/123').get();

  return request.ref.set({ test: 'random' })
    .then(() => res.send('ok!'))
    .catch((err) => res.status(500).send('error'));
});

يعمل فقط إذا قمت بتعيين حساب خدمة عند الاتصال بـ admin.initializeApp() :

// this works
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
});

@ wceolin شكرا لذلك! هل يمكنك تشغيل ما يلي داخل دليل الوظائف الخاص بك؟

$ npm list @google-cloud/firestore

هذه هي نتيجتي (وكل شيء يعمل معي):

functions@ /tmp/tmp.ZkMEM0XGPF/functions
└─┬ [email protected]
  └── @google-cloud/[email protected]

حصلت على نفس النتيجة: 🤔

Screen Shot 2019-07-01 at 15 44 35

لذلك أنا أسير في طريقي لأعلى في تتبع مكدس الأخطاء وفي هذه الوظيفة:
https://github.com/googleapis/gax-nodejs/blob/e1be4ebcc2287c61d5f1884033449e3b4e143242/src/grpc.ts#L141

لدينا هذا التفرع:

 async _getCredentials(opts: ClientStubOptions) {
    if (opts.sslCreds) {
      return opts.sslCreds;
    }
    const grpc = this.grpc;
    const sslCreds = grpc.credentials.createSsl();
    const client = await this.auth.getClient();
    const credentials = grpc.credentials.combineChannelCredentials(
      sslCreds,
      grpc.credentials.createFromGoogleCredential(client)
    );
    return credentials;
  }

في الكود الخاص بي ، تم تعريف opts.sslCreds لذلك قمت بالضغط على هذا الفرع:

    if (opts.sslCreds) {
      return opts.sslCreds;
    }

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

wceolin هل يمكنك الوصول إلى مجلد node_modules وتعديل هذا الملف functions/node_modules/google-gax/build/src/grpc.js للحصول على console.log() يطبع الكائن options في createStub وظيفة واسمحوا لي أن أعرف ما تراه؟

شكرا لكم على مساعدتكم حتى الآن!

samtstern لست متأكدًا مما إذا كان هذا مفيدًا ، لكنني أجريت مجموعة من التغييرات والتبديل باستخدام package.json و node_modules خلال عطلة نهاية الأسبوع. لم يعد لدي مشكلة في 7.0.2.

الناتج npm list @google-cloud/firestore يطابق مخرجاتك.

لقد قمت بتفريغ دليل node_modules الخاص بي خلال عطلة نهاية الأسبوع ، لذا أتساءل عما إذا كان ذلك مرتبطًا.

noelmansour شكرًا على هذه الملاحظة ، يشرح لماذا لا يمكنني التكاثر في إعداد نظيف.

noelmansour لقد حاولت أيضًا حذف node_modules ، yarn.lock ، مع إزالة التبعيات لكنها لم تنجح معي. سأحاول إنشاء مشروع من البداية لمعرفة ما سيحدث.

noelmansour هذا ما حصلت عليه من الكائن options :

{
  "clientConfig": {},
  "port":443,
  "servicePath":"firestore.googleapis.com",
  "credentials":{},
  "projectId":"my-test-project",
  "firebaseVersion":"8.2.0",
  "libName":"gccl",
  "libVersion":"2.2.3 fire/8.2.0",
  "scopes":[
    "https://www.googleapis.com/auth/cloud-platform", 
    "https://www.googleapis.com/auth/datastore"
  ]
}

بفضل @ wceolin ، هذا مفيد للغاية لأن هذا هو ما يبدو لي ( وكيف يجب أن يبدو):

{
   "clientConfig":{},
   "port":8080,
   "servicePath":"localhost",
   "credentials":{},
   "projectId":"fir-dumpster",
   "firebaseVersion":"8.2.0",
   "libName":"gccl",
   "libVersion":"2.2.3 fire/8.2.0",
   "service":"firestore.googleapis.com",
   "sslCreds":{
      "callCredentials": {}
   },
   "customHeaders":{
      "Authorization":"Bearer owner"
   },
   "scopes":[
      "https://www.googleapis.com/auth/cloud-platform",
      "https://www.googleapis.com/auth/datastore"
   ]
}

كما ترى ، لا يزال عميلك يحاول الوصول إلى الإنتاج ، ثم يفشل لأن محاكي الوظائف غير مخول للقيام بذلك.

هل تقوم أيضًا بتشغيل محاكي firestore؟ هل هدفك هو الكتابة إلى محاكي firestore أم أنك تريد فعلاً الكتابة إلى متجر fireestore؟

أوه لقد تمكنت أخيرًا من استنساخ هذا! إذا قمت بتشغيل firebase emulators:start --only functions فأنا أحاول الكتابة إلى متجر Firestore يظهر لي هذا الخطأ.

أرى رسالة السجل هذه:

⚠  The Cloud Firestore emulator is not running so database operations will fail with a 'default credentials' error.

الذي لم يعد صحيحًا تمامًا (الخطأ يتعلق بـ client_email) ولكن الاكتشاف لا يزال صحيحًا. هل يرى الآخرون هنا هذا التحذير أيضًا؟

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

export FIRESTORE_EMULATOR_HOST="localhost:8080"

عندما أزيله ، أحصل على الخطأ. وهذا باستخدام الأمر firebase emulators:start

noelmansour هل يمكنك تشغيل هذا الأمر باستخدام --debug وإرفاق السجلات هنا كملف txt ؟

samtstern أحيانًا كنت أستخدم المحاكي لخدمة وظيفة HTTP محليًا والتي تحدد بعض البيانات في الإنتاج (عادةً للقيام ببعض ترحيل البيانات). أنا استخدم:

firebase serve --only functions --project myProjectAlias

لست متأكدًا مما إذا كان من المفترض أن يعمل بهذه الطريقة (مما يسمح لنا بكتابة البيانات إلى الإنتاج) ولكنه كان يعمل. 😅

wceolin لم يكن من المفترض أن تعمل بهذه initializeApp() بعد 6.8.0 . لدي أيضًا حالة الاستخدام هذه ولكننا نريد إيجاد طريقة لإجراء هذا الاشتراك بحيث يكون الوضع الافتراضي هو حماية الإنتاج.

لكن يسعدني أن أعرف من أين يأتي هذا الخطأ من الآن!

samtstern فقط للتأكيد ، قم بتشغيل firebase emulators:start --debug مع عدم تعيين FIRESTORE_EMULATOR_HOST ، أليس كذلك؟

صيح!

في يوم الإثنين ، 1 يوليو 2019 ، الساعة 12:28 مساءً ، كتب نويل منصور [email protected] :

samtstern https://github.com/samtstern فقط للتأكيد ، قم بتشغيل firebase
المحاكيات: ابدأ --debug مع عدم تعيين FIRESTORE_EMULATOR_HOST ، أليس كذلك؟

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/firebase/firebase-tools/issues/1451؟email_source=notifications&email_token=ACATB2WV27VPIODNLGFS4TLP5JLGBA5CNFSM4H4GTWI2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODY7DO2Q#issuecomment-507393898 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/ACATB2WG4EAD5KU7YRB5AUTP5JLGBANCNFSM4H4GTWIQ
.

ها هو.

لمعلوماتك ، قمت بإزالة معرف المشروع من هذا السطر (لا أعتقد أنه مهم):
[2019-07-01T19:32:42.859Z] >>> HTTP REQUEST GET https://mobilesdk-pa.googleapis.com/v1/projects/<project-id>:getServerAppConfig

debug.txt

ومن الجدير بالذكر أيضًا أنه بدون تصدير المتغير env ، فإن [email protected] يعطيني هذا الخطأ:

⚠  Error: Getting metadata from plugin failed with error: Header field "authorization" must have only a single value
    at Http2CallStream.call.on (/Users/noel/dev/snowble/functions/node_modules/@grpc/grpc-js/build/src/call.js:68:41)
    at emitOne (events.js:121:20)
    at Http2CallStream.emit (events.js:211:7)
    at process.nextTick (/Users/noel/dev/snowble/functions/node_modules/@grpc/grpc-js/build/src/call-stream.js:71:22)
    at _combinedTickCallback (internal/process/next_tick.js:132:7)
    at process._tickCallback (internal/process/next_tick.js:181:9)
⚠  Your function was killed because it raised an unhandled error.

شكرا noelmansour على تلك السجلات. هل تمانع في إظهار رمز وظائفك أيضًا؟

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

index.ts:

require('./common'); // this should always be first in this file

export * from './debug'
// other exports for other functions

Common.ts:

import * as admin from 'firebase-admin';

export const app = admin.initializeApp();

debug.ts:

import * as admin from 'firebase-admin';
import * as functions from 'firebase-functions';
import {app} from "./common";

export const hello = functions.https.onRequest(async (req, resp) => {
    const firestore = app.firestore();
    const users = await firestore.collection('users').get();
    console.log('empty users collection? ' + users.empty);
    resp.sendStatus(200);
});

package.json:

{
  "name": "functions",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "serve": "npm run build && firebase serve --only functions",
    "shell": "npm run build && firebase functions:shell",
    "emulators": "npm run build && firebase emulators:start",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "8"
  },
  "main": "lib/index.js",
  "dependencies": {
    "@google-cloud/tasks": "^1.1.0",
    "@types/jsonwebtoken": "^8.3.2",
    "@types/request-promise": "^4.1.42",
    "firebase-admin": "^8.2.0",
    "firebase-functions": "^3.0.2",
    "request": "^2.88.0",
    "request-promise": "^4.2.4"
  },
  "devDependencies": {
    "tslint": "^5.12.0",
    "typescript": "^3.2.2"
  },
  "private": true
}

noelmansour شكرا لك! لقد كشف هذا للتو عن خطأ لي. يجب أن يكون هذان الشيئان متطابقين لكنهما ليسا:

الخيار 1

admin.initializeApp();
const firestore = admin.firestore();

الخيار 2

const app = admin.initializeApp();
const firestore = app.firestore();

نعم ، هذا أصلحها بالنسبة لي. شكر!

أواجه أيضًا الخطأ Error: The incoming JSON object does not contain a client_email field . لا يمكن إصلاحه.

رمز افتراضي:

import { initializeApp } from 'firebase-admin';

// Initiate Firebase app
export const app = initializeApp();
export const db = app.firestore();
export const auth = app.auth();

محاولة أخرى:

import { initializeApp, firestore, auth as defAuth } from 'firebase-admin';

// Initiate Firebase app
export const app = initializeApp();
export const db = firestore();
export const auth = defAuth();

محاولة أخرى:

import * as admin from 'firebase-admin';

// Initiate Firebase app
export const app = admin.initializeApp();
export const db = admin.firestore();
export const auth = admin.auth();

JFGHT ما هو الأمر الذي تستخدمه لتشغيل المحاكيات؟ هل يمكنك إظهار الأمر والسجلات من تشغيله بعلامة --debug ؟

_ إخلاء المسؤولية: لست متأكدًا من مدى ارتباط مشكلتي بهذه المشكلة هنا ، ولكن على الأقل يمكنني ترك معلوماتي هنا لأنها قد تساعد بعضًا منكم.

كان لدي نفس الشيء في وظيفة Firebase التي تحاول تحديث بعض المستندات في قاعدة بيانات firestore دفعة واحدة. (لم تختبر بدون دفعة).

هذا هو Callstack:

Unhandled error Error: The incoming JSON object does not contain a client_email field
>      at JWT.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\jwtclient.js:165:19)
>      at GoogleAuth.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:294:16)
>      at GoogleAuth.getClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:476:52)
>      at GrpcClient._getCredentials (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:107:40)
>      at GrpcClient.createStub (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:223:34)
>      at new FirestoreClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\v1\firestore_client.js:128:39)
>      at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:315:26)
>      at ClientPool.acquire (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:61:35)
>      at ClientPool.run (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:114:29)
>      at Firestore.readStream (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:995:26)

RESPONSE RECEIVED FROM FUNCTION: 500, {
  "error": {
    "status": "INTERNAL",
    "message": "INTERNAL"
  }
}

كنت أقوم بتشغيل وظيفتي محليًا باستخدام سطر الأوامر:
firebase functions:shell

كنت أستخدم هذا الرمز:

// Reference report in Firestore
const db = admin.firestore();

admin.initializeApp();

export const performMyCallableFirebaseFunction = (db,, { from, to }) => {
    return db.collection("collectionName").where("prop", "==", from).limit(500).get().then(snapshot => {
        if (snapshot.empty) return new Promise(resolve => resolve(`No docs found with prop: ${from}`));

        const batch = db.batch();
        snapshot.forEach(doc => batch.update(doc.ref, { prop: to }));

        return batch.commit();
    });
};
exports.myCallableFirebaseFunction = functions.https.onCall(data => performMyCallableFirebaseFunction(db, data.from, data.to));

لقد غيرت الخط
admin.initializeApp();
إلى
admin.initializeApp({ credential: admin.credential.applicationDefault() });
والآن تمكنت من الاتصال بوظيفتي محليًا باستخدام:

firebase functions:shell
firebase > myCallableFirebaseFunction({from: "foo", to: "bar"})

راجع المستندات لـ admin.credential.applicationDefault ()

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

concurrently --kill-others 'GOOGLE_APPLICATION_CREDENTIALS=service-account.json firebase serve --only functions' 'tsc --project ./ --watch'

فيما يتعلق بالسجلات ، لا يمكن أن يكون اليوم ، أنا آسف لذلك!

لقد غيرت الخط
admin.initializeApp();
إلى
admin.initializeApp({ credential: admin.credential.applicationDefault() });

هذا عمل معي. أقوم بتشغيل الوظائف محليًا عبر:
firebase serve --only functions

ليس من الواضح بالنسبة لي ما إذا كان هذا آمنًا للإنتاج. من المستندات ، يبدو أنه سيعطي وصول المسؤول إلى الكود قيد الإنتاج ولكن هذا صحيح على أي حال.

@ ralphsmith80 aah ربما تكون على حق:

البحث عن بيانات الاعتماد تلقائيًا
تستخدم مكتبات عملاء GCP إستراتيجية تسمى بيانات اعتماد التطبيق الافتراضية (ADC) للعثور على بيانات اعتماد التطبيق الخاص بك. عندما تستخدم التعليمات البرمجية مكتبة العميل ، تتحقق الاستراتيجية من بيانات الاعتماد الخاصة بك بالترتيب التالي:

أولاً ، يتحقق ADC لمعرفة ما إذا تم تعيين متغير البيئة GOOGLE_APPLICATION_CREDENTIALS. إذا تم تعيين المتغير ، يستخدم ADC ملف حساب الخدمة الذي يشير إليه المتغير. يصف القسم التالي كيفية تعيين متغير البيئة.

إذا لم يتم تعيين متغير البيئة ، فإن ADC تستخدم حساب الخدمة الافتراضي الذي يوفره Compute Engine و Kubernetes Engine و App Engine و Cloud Functions للتطبيقات التي تعمل على تلك الخدمات.

إذا تعذر على ADC استخدام أي من بيانات الاعتماد المذكورة أعلاه ، فسيحدث خطأ.

هذه الإستراتيجية مفيدة عند الاختبار والتجريب ، ولكنها قد تجعل من الصعب معرفة بيانات الاعتماد التي يستخدمها تطبيقك.

المصدر: https://cloud.google.com/docs/authentication/production

لقد غيرت الخط
admin.initializeApp();
إلى
admin.initializeApp({ credential: admin.credential.applicationDefault() });

هذه الطريقة تخلق خطأ جديدًا تمامًا بالنسبة لي.

Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.
      at GoogleAuth.getApplicationDefaultAsync (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:161:19)
     at process._tickCallback (internal/process/next_tick.js:68:7)

أقوم أيضًا بتهيئة المتجر كما ذكرت في # 1454

admin.initializeApp();
const db = admin.firestore(); 

مع إضافة بيانات الاعتماد إلى initializeApp ، يظهر لي الخطأ أعلاه.
بدونها ، ما زلت أحصل على ؛

Error: The incoming JSON object does not contain a client_email field
      at JWT.fromJSON (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/jwtclient.js:165:19)
      at GoogleAuth.fromJSON (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:294:16)
      at GoogleAuth.getClient (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:476:52)
      at GrpcClient._getCredentials (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-gax/build/src/grpc.js:107:40)
      at GrpcClient.createStub (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-gax/build/src/grpc.js:223:34)
      at new FirestoreClient (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/v1/firestore_client.js:128:39)
      at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/index.js:315:26)
      at ClientPool.acquire (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/pool.js:61:35)
      at ClientPool.run (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/pool.js:114:29)
      at Firestore.readStream (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/index.js:995:26)

أتلقى نفس الخطأ في برنامج تعليمي أساسي (البرنامج التعليمي من يونيو 2019) لذا يبدو هذا الخطأ جديدًا جدًا ...

INDEX.JS:

"" وظائف const = تتطلب ('وظائف Firebase') ؛
const admin = تتطلب ('firebase-admin') ؛
admin.initializeApp () ،

admin.firestore()
    .collection('screams')
    .add(newScream)
    .then(doc => {
        res.json({message: `document ${doc.id} created successfully`});
    }) 
    .catch(err => {
        res.status(500).json({ error: 'oops, something went wrong'});
        console.error(err);
    });

}) ؛


عندما أقوم بتشغيل نقطة النهاية في Postman ، أتلقى رسالة الخطأ

"خطأ": "عفوًا ، حدث خطأ"

مع وحدة التحكم تفيد:

الوظائف: بدء تنفيذ "createScream"
خطأ: لا يحتوي كائن JSON الوارد على حقل client_email

البرنامج التعليمي من FreeCodeCamp - https://www.youtube.com/watch؟v=m_u6P5k0vP0

Firebase Console> الإعدادات (رمز الترس)> المستخدمون والأذونات> حسابات الخدمة

توليد مفتاح جديد.

أضف json إلى مجلد مشروعك.

var admin = require("firebase-admin");

var serviceAccount = require("path/to/serviceAccountKey.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://lts-profile.firebaseio.com"
});

يجعل ملف json الخاص بحساب الخدمة خدمات وميزات Firebase متاحة لمشروعك.
يجب أن يكون دائمًا خاصًا. قم بتضمين الملف بتنسيق gitignore

Firebase Console> الإعدادات (رمز الترس)> المستخدمون والأذونات> حسابات الخدمة

توليد مفتاح جديد.

أضف json إلى مجلد مشروعك.

var admin = require("firebase-admin");

var serviceAccount = require("path/to/serviceAccountKey.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://lts-profile.firebaseio.com"
});

يجعل ملف json الخاص بحساب الخدمة خدمات وميزات Firebase متاحة لمشروعك.
يجب أن يكون دائمًا خاصًا. قم بتضمين الملف بتنسيق gitignore


شكرًا phtn ، أقدر - لقد اتبعت تعليماتك ولكني الآن أتلقى الخطأ

Error: Error occurred while parsing your function triggers.

بغرابة عندما أقوم بتشغيل "نشر Firebase" كل شيء يعمل على: " https: //europe-west1-myapp.cloudfunctions.net/api / ... - فقط ليس على localhost؟

يجب أن يكون serviceAccountKey.json في دليل /functions .

firebase deploy --only functions إذا كان بالخارج.

شكرا مرة أخرى (على التحلي بالصبر!). توجد خدمة my serviceAccountKey.json في مجلد / function (انظر لقطة الشاشة على الرابط أدناه).

يبدو أن هناك ثلاث طرق لبدء التطبيق ... لقد جربت كل هذه الأشياء الثلاثة بشكل فردي ولا يبدو أن أيًا منها يعمل - لدي شعور بأن هذا سيكون شيئًا بسيطًا مجنونًا أفتقده.

د

مسكة الشاشة:
Screenshot 2019-07-10 at 09 22 32

نحن نواجه نفس المشكلة من جانبنا. نحن بصدد تهيئة Firebase بموجب هذا النموذج:

const firebaseInstance = admin.initializeApp ()
const firestoreInstance = firebaseInstance.firestore ()

اسمحوا لي أن أعرف ما إذا كان بإمكاننا تقديم أي شيء للمساعدة في تعقب ذلك.

الجميع في هذا الموضوع. اكتشفنا حلا. قمنا بتخفيض إصدار أدوات Firebase من 7.0.2 إلى 7.0.1 وتلقينا خطأ مختلفًا تمامًا (شيء يتعلق بعدم القدرة على تحميل بيانات الاعتماد الافتراضية).

لذلك واصلنا تشغيل:

gcloud auth application-default login

هذا أصلح مشكلتنا

ryanhornberger ، يمكنك

const firebaseInstance = admin.initializeApp()
const firestoreInstance = admin.firestore() // I changed this line

لدي إصلاح لذلك قادم في # 1459

samtstern شكرا لك!

الجميع في هذا الموضوع. اكتشفنا حلا. قمنا بتخفيض إصدار أدوات Firebase من 7.0.2 إلى 7.0.1 وتلقينا خطأ مختلفًا تمامًا (شيء يتعلق بعدم القدرة على تحميل بيانات الاعتماد الافتراضية).

لذلك واصلنا تشغيل:

gcloud auth application-default login

هذا أصلح مشكلتنا

هذا يعمل بالنسبة لي. لقد قمت في البداية بترقية أدوات Firebase إلى 7.1 ، وحصلت على "الخطأ نفسه" عندما أقوم بتشغيل "firebase serve" في بلدي المحلي. ومع ذلك ، فإن الأمر يعمل بشكل جيد إذا تم نشره في Firebase. خفضت إلى 7.0.1 يعمل بالنسبة لي في بلدي المحلي.

نفس المشكلة مع 7.1

نحن نعمل على إصلاح ، لكنه ليس جاهزًا بعد:
https://github.com/firebase/firebase-tools/pull/1479

أنا عالق مع هذا من فضلك ، بأي طريقة للخروج؟

الرجوع إلى الإصدار 7.0.1 لم يساعدني

تم دمج إصلاح لهذا في # 1479 وسيتم تضمينه في الإصدار التالي (لذلك 7.2.0 )

مرحبًا samtstern ، لست متأكدًا مما إذا كان شيئًا أقوم به بشكل غير صحيح ، أو ربما

أولاً ، أتلقى التحذير التالي عند تشغيل firebase emulators:exec "npm run test" :

⚠ The Cloud Firestore emulator is not running, so calls to Firestore will affect production.

على الرغم من أنه في وقت سابق في الأمر ، يمكنني أن أرى أنه يبدأ المحاكي:

~/d/s/functions ❯❯❯ firebase emulators:exec "npm run test"                                                                                                                           ✘ 130
i  Starting emulators: ["functions","firestore"]
✔  functions: Using node<strong i="12">@8</strong> from host.
✔  functions: Emulator started at http://localhost:5001
i  firestore: Logging to firestore-debug.log
✔  firestore: Emulator started at http://localhost:8080
i  firestore: For testing set FIRESTORE_EMULATOR_HOST=localhost:8080

إنه لا يقوم في الواقع بتحديث قاعدة بيانات متجر الألعاب النارية. ربما مجرد سلبية خاطئة؟

المشكلة الأخرى هي أنني ما زلت أتلقى الخطأ. لم أقم بتعيين $GOOGLE_APPLICATION_CREDENTIALS ، ولكن وفقًا لـ https://firebase.google.com/docs/functions/local-emulator#set_up_admin_credentials_optional ، يجب أن يكون هناك بالفعل إذن كافٍ في حالة الوصول إلى متجر النار فقط:

تحتوي مشغلات Cloud Firestore و Realtime Database بالفعل على بيانات اعتماد كافية ، ولا تتطلب إعدادًا إضافيًا.

أقوم بتهيئة admin sdk بدون أي معلمات باستخدام admin.initializeApp(); ربما شيء أفعله بشكل غير صحيح؟

noelmansour شكرًا على الإبلاغ عن هذا (ومحاولة master !) هل يمكنك إظهار رمز ملف الوظائف الرئيسي الخاص بك؟

من المؤكد تقريبًا وجود سلبي كاذب ، ولكنه سلبي مهم نحتاج إلى إصلاحه.

إنه ضئيل للغاية لأنه مجرد تصدير من ملفات أخرى:

import * as admin from 'firebase-admin';

// this should happen before any function runs
admin.initializeApp();

export * from './authFunctions';
export * from './fitbit';
export * from './sleep'
export * from './scheduler';
export * from './debug'
export {scheduleFunction} from "./scheduler";

في الواقع ، يبدو أن هناك مشكلة في إعداد الاختبار الخاص بي. عند تشغيل firebase emulators:start لا أرى التحذير.

noelmansour كيف تبدو اختباراتك؟ يمكنك أيضًا تقديم مشكلة جديدة لمناقشة هذا الأمر حتى لا نرسل بريدًا عشوائيًا إلى الجميع في هذا الموضوع>

نعم طبعا. اعتذاري. # 1530 مفتوحا

الجميع في هذا الموضوع. اكتشفنا حلا. قمنا بتخفيض إصدار أدوات Firebase من 7.0.2 إلى 7.0.1 وتلقينا خطأ مختلفًا تمامًا (شيء يتعلق بعدم القدرة على تحميل بيانات الاعتماد الافتراضية).
لذلك واصلنا تشغيل:

gcloud auth application-default login

هذا أصلح مشكلتنا

هذا يعمل بالنسبة لي. لقد قمت في البداية بترقية أدوات Firebase إلى 7.1 ، وحصلت على "الخطأ نفسه" عندما أقوم بتشغيل "firebase serve" في بلدي المحلي. ومع ذلك ، فإن الأمر يعمل بشكل جيد إذا تم نشره في Firebase. خفضت إلى 7.0.1 يعمل بالنسبة لي في بلدي المحلي.

هل يمكنك معرفة كيفية تقليل إصدار قاعدة Firebase؟ نسختي الحالي هو 7.0.2 ثم حاولت تركيب الآلية الوقائية الوطنية ط [email protected] -g هذا. ولكن لا يزال الإصدار الخاص بي هو 7.0.2. كيفية الرجوع الرجاء المساعدة؟

تم إصدار الإصلاح الكامل لهذه المشكلة في 7.2.0 :

npm install -g [email protected]

إذا كنت لا تزال تواجه خطأً مشابهًا في هذا الإصدار ، فيرجى فتح مشكلة جديدة.

وجود هذه المشكلة نفسها مع وظائف Firebase. حاولت بالفعل الآلية الوقائية الوطنية تثبيت -g [email protected] الناتجة في نفس الخطأ.

Screen Shot 2019-12-12 at 4 23 57 AM

Screen Shot 2019-12-12 at 4 21 30 AM

وجود هذه المشكلة نفسها مع وظائف Firebase. حاولت بالفعل الآلية الوقائية الوطنية تثبيت -g [email protected] الناتجة في نفس الخطأ.

Screen Shot 2019-12-12 at 4 23 57 AM

Screen Shot 2019-12-12 at 4 21 30 AM

نجح الحل التالي بالنسبة لي:

// Create Firebase-adminsdk key

// Providing a service account object inline
admin.initializeApp({
    credential: admin.credential.cert({
        projectId: "<PROJECT_ID>",
        clientEmail: "foo@<PROJECT_ID>.iam.gserviceaccount.com",
        privateKey: "-----BEGIN PRIVATE KEY-----<KEY>-----END PRIVATE KEY-----\n"
    })
});
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات