Firebase-tools: "Fehler: Das eingehende JSON-Objekt enthält kein client_email-Feld" nach dem Upgrade auf 7.0.2

Erstellt am 28. Juni 2019  ·  61Kommentare  ·  Quelle: firebase/firebase-tools

[ERFORDERLICH] Umgebungsinformationen


Firebase-Tools: 7.0.2


Plattform: Oracle Linux Server 7.6, Knoten 10.15

[ERFORDERLICH] Testfall


emulieren Sie die https-Funktion mit "firebase-admin": "^ 8.2.0", "firebase-functions": "^ 3.0.2"

[ERFORDERLICH] Schritte zum Reproduzieren

Führen Sie eine beliebige https-Funktion mit Firebase- Funktionen aus: Shell

[ERFORDERLICH] Erwartetes Verhalten

kein Fehler (firebase-tools 7.0.0 löst keinen Fehler aus)

[ERFORDERLICH] Tatsächliches Verhalten

Anfrage zur Funktion gesendet.

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

Hilfreichster Kommentar

Haftungsausschluss: Ich bin mir nicht sicher, wie mein Problem mit diesem hier zusammenhängt, aber zumindest kann ich meine Informationen hier ablegen, da dies einigen von Ihnen helfen könnte.

Ich hatte das gleiche in einer Firebase-Funktion, die versucht, ein Dokument in der Firestore-Datenbank im Batch zu aktualisieren. (Nicht ohne Charge getestet).

Dies ist der 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"
  }
}

Ich habe meine Funktion lokal über die Befehlszeile ausgeführt:
firebase functions:shell

Ich habe diesen Code verwendet:

// 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));

Ich habe die Leitung geändert
admin.initializeApp();
zu
admin.initializeApp({ credential: admin.credential.applicationDefault() });
und jetzt konnte ich meine Funktion lokal aufrufen mit:

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

Siehe Dokumente für admin.credential.applicationDefault ()

Alle 61 Kommentare

@noelmansour danke, es scheint also, dass etwas zwischen 7.0.1 und 7.0.2 verursacht hat. Ich werde mir die vorgenommenen Änderungen ansehen.

Ich habe auch dieses Problem seit 7.0.2

Gerade auf 7.0.2 aktualisiert, dies auch zu sehen. Überprüft meine Kontoanmeldeinformationen und das Feld client_email ist vorhanden.

Könnte jemand den Code einer Funktion freigeben, die er im Emulator ausführen möchte, der mit diesem Fehler fehlschlägt? Je einfacher desto besser.

@samtstern Der folgende Code schlägt für mich fehl:

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'));
});

Es funktioniert nur, wenn ich beim Aufrufen von admin.initializeApp() ein Dienstkonto eingerichtet habe:

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

@wceolin danke dafür! Können Sie Folgendes in Ihrem Funktionsverzeichnis ausführen?

$ npm list @google-cloud/firestore

Dies ist mein Ergebnis (und alles funktioniert für mich):

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

Ich habe das gleiche Ergebnis erhalten: 🤔

Screen Shot 2019-07-01 at 15 44 35

Also gehe ich den Fehlerstapel-Trace hoch und in dieser Funktion:
https://github.com/googleapis/gax-nodejs/blob/e1be4ebcc2287c61d5f1884033449e3b4e143242/src/grpc.ts#L141

Wir haben diese Verzweigung:

 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;
  }

In meinem Code ist opts.sslCreds definiert, also habe ich diesen Zweig getroffen:

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

Es ist der andere Zweig, der versucht, Anmeldeinformationen zusammenzustellen, und Probleme verursacht. Jetzt muss ich herausfinden, warum mein Code in eine Richtung geht und Ihr Code in eine andere Richtung.

@wceolin könnten Sie in Ihren Ordner node_modules greifen und diese Datei functions/node_modules/google-gax/build/src/grpc.js bearbeiten, um ein console.log() , das das options -Objekt im createStub druckt

Vielen Dank für Ihre bisherige Hilfe!

@samtstern Ich bin

Die Ausgabe von npm list @google-cloud/firestore entspricht Ihrer.

Ich habe über das Wochenende mein node_modules-Verzeichnis geknackt, also frage ich mich, ob das damit zusammenhängt.

@noelmansour danke für diesen Hinweis, erklärt, warum ich in einem sauberen Setup nicht reproduzieren kann.

@noelmansour Ich habe auch versucht, meine node_modules , yarn.lock löschen und Abhängigkeiten zu entfernen, aber es hat bei mir nicht funktioniert. Ich werde versuchen, ein Projekt von Grund auf neu zu erstellen, um zu sehen, was passiert.

@noelmansour das habe ich vom options Objekt bekommen:

{
  "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 danke das ist sehr hilfreich, denn so sieht meins aus (und wie es aussehen sollte):

{
   "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"
   ]
}

Wie Sie sehen, versucht Ihr Client immer noch, auf die Produktion zuzugreifen, und schlägt dann fehl, weil der Funktionsemulator nicht dazu berechtigt ist.

Führen Sie auch den Firestore-Emulator aus? Ist es Ihr Ziel, in den Firestore-Emulator zu schreiben, oder möchten Sie tatsächlich in den Produktions-Firestore schreiben?

Oh, ich war endlich in der Lage, dies zu reproduzieren! Wenn ich firebase emulators:start --only functions ausführe, versuche ich, an Firestore zu schreiben. Ich erhalte diesen Fehler.

Ich sehe diese Protokollmeldung:

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

Was nicht mehr genau richtig ist (der Fehler betrifft client_email), aber die Erkennung ist immer noch korrekt. Sehen auch andere hier diese Warnung?

Hier sind einige weitere Informationen, die helfen können. Über das Wochenende hatte ich auch explizit die env-Variable des Firestore-Emulators in meiner .zshrc festgelegt:

export FIRESTORE_EMULATOR_HOST="localhost:8080"

Wenn ich es entferne, erhalte ich den Fehler. Und das mit dem Befehl firebase emulators:start

@noelmansour Kannst du diesen Befehl mit --debug ausführen und die Protokolle hier als txt Datei anhängen?

@samtstern Manchmal habe ich den Emulator verwendet, um eine HTTP-Funktion lokal durchzuführen ). Ich benutze:

firebase serve --only functions --project myProjectAlias

Ich bin mir nicht sicher, ob es so funktionieren sollte (damit wir Daten in die Produktion schreiben können), aber es hat früher funktioniert. 😅

@wceolin es sollte nicht so funktionieren mit nackten initializeApp() in Versionen nach 6.8.0 . Ich habe auch diesen Anwendungsfall, aber wir möchten einen Weg finden, dieses Opt-In so zu gestalten, dass die Produktion standardmäßig geschützt wird.

Aber ich bin froh zu wissen, woher dieser Fehler kommt!

@samtstern Nur um zu bestätigen, führen Sie firebase emulators:start --debug wobei FIRESTORE_EMULATOR_HOST nicht gesetzt ist, richtig?

Richtig!

Am Montag, 1. Juli 2019, 12:28 Uhr schrieb Noel Mansour [email protected] :

@samtstern https://github.com/samtstern Führen Sie zur Bestätigung Firebase aus
Emulatoren: start --debug mit nicht gesetztem FIRESTORE_EMULATOR_HOST, richtig?

- -
Sie erhalten dies, weil Sie erwähnt wurden.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/firebase/firebase-tools/issues/1451?email_source=notifications&email_token=ACATB2WV27VPIODNLGFS4TLP5JLGBA5CNFSM4H4GTWI2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODY7DO2Q#issuecomment-507393898 ,
oder schalten Sie den Thread stumm
https://github.com/notifications/unsubscribe-auth/ACATB2WG4EAD5KU7YRB5AUTP5JLGBANCNFSM4H4GTWIQ
.

Hier ist es.

Zu Ihrer Information Ich habe die Projekt-ID aus dieser Zeile entfernt (glaube nicht, dass es wichtig ist):
[2019-07-01T19:32:42.859Z] >>> HTTP REQUEST GET https://mobilesdk-pa.googleapis.com/v1/projects/<project-id>:getServerAppConfig

debug.txt

Erwähnenswert, ohne die env Variable zu exportieren, [email protected] gibt mir diese Fehlermeldung:

⚠  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.

Vielen Dank an @noelmansour für diese Protokolle. Würde es Ihnen etwas ausmachen, auch Ihren Funktionscode anzuzeigen?

Es ist ein wenig knifflig, weil ich lieber nicht alle meine Funktionen gemeinsam nutzen möchte und ich momentan keine Zeit habe, um zu überprüfen, ob dies den Fehler isoliert wiedergibt, aber hier ist die Hallo-Funktion, die ich ausgeführt habe:

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 danke! Das hat mir gerade einen Fehler gezeigt. Diese beiden Dinge sollten identisch sein, sind aber nicht:

Option 1

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

Option 2

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

Ja, das hat es für mich behoben. Vielen Dank!

Ich habe auch den Fehler Error: The incoming JSON object does not contain a client_email field . Konnte es nicht reparieren.

Standardcode:

import { initializeApp } from 'firebase-admin';

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

Noch ein Versuch:

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

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

Noch ein Versuch:

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 Mit welchem ​​Befehl führen Sie die Emulatoren aus? Können Sie den Befehl und die Protokolle der Ausführung mit dem Flag --debug anzeigen?

Haftungsausschluss: Ich bin mir nicht sicher, wie mein Problem mit diesem hier zusammenhängt, aber zumindest kann ich meine Informationen hier ablegen, da dies einigen von Ihnen helfen könnte.

Ich hatte das gleiche in einer Firebase-Funktion, die versucht, ein Dokument in der Firestore-Datenbank im Batch zu aktualisieren. (Nicht ohne Charge getestet).

Dies ist der 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"
  }
}

Ich habe meine Funktion lokal über die Befehlszeile ausgeführt:
firebase functions:shell

Ich habe diesen Code verwendet:

// 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));

Ich habe die Leitung geändert
admin.initializeApp();
zu
admin.initializeApp({ credential: admin.credential.applicationDefault() });
und jetzt konnte ich meine Funktion lokal aufrufen mit:

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

Siehe Dokumente für admin.credential.applicationDefault ()

@samtstern

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

In Bezug auf die Protokolle kann heute nicht sein, das tut mir leid!

Ich habe die Leitung geändert
admin.initializeApp();
zu
admin.initializeApp({ credential: admin.credential.applicationDefault() });

Das hat bei mir funktioniert. Ich führe Funktionen lokal aus über:
firebase serve --only functions

Mir ist nicht klar, ob dies für die Produktion sicher ist. Aus den Dokumenten geht hervor, dass es dem Administrator Zugriff auf den in der Produktion laufenden Code gewähren würde, aber das stimmt trotzdem.

@ ralphsmith80 aah du hast wahrscheinlich recht:

Anmeldeinformationen automatisch finden
GCP-Clientbibliotheken verwenden eine Strategie namens ADC (Application Default Credentials), um die Anmeldeinformationen Ihrer Anwendung zu ermitteln. Wenn Ihr Code eine Clientbibliothek verwendet, überprüft die Strategie Ihre Anmeldeinformationen in der folgenden Reihenfolge:

Zunächst prüft ADC, ob die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS festgelegt ist. Wenn die Variable festgelegt ist, verwendet ADC die Dienstkontodatei, auf die die Variable verweist. Im nächsten Abschnitt wird beschrieben, wie Sie die Umgebungsvariable festlegen.

Wenn die Umgebungsvariable nicht festgelegt ist, verwendet ADC das Standarddienstkonto, das Compute Engine, Kubernetes Engine, App Engine und Cloud-Funktionen für Anwendungen bereitstellen, die auf diesen Diensten ausgeführt werden.

Wenn ADC keinen der oben genannten Anmeldeinformationen verwenden kann, tritt ein Fehler auf.

Diese Strategie ist beim Testen und Experimentieren hilfreich, kann es jedoch schwierig machen, festzustellen, welche Anmeldeinformationen Ihre Anwendung verwendet.

Quelle: https://cloud.google.com/docs/authentication/production

Ich habe die Leitung geändert
admin.initializeApp();
zu
admin.initializeApp({ credential: admin.credential.applicationDefault() });

Diese Methode erzeugt einen ganz neuen Fehler für mich.

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)

Ich initialisiere auch den Speicher, wie Sie in # 1454 angegeben haben

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

Mit dem zusätzlichen Berechtigungsnachweis für initializeApp wird der obige Fehler angezeigt.
Ohne es bekomme ich immer noch;

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)

Ich erhalte den gleichen Fehler in einem einfachen Tutorial (Tutorial ist ab Juni 2019), daher sieht dieser Fehler ziemlich neu aus ...

INDEX.JS:

`` `const functions = require ('firebase-functions');
const admin = require ('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);
    });

});


Wenn ich den Endpunkt in Postman starte, erhalte ich die Fehlermeldung

"Fehler": "Ups, etwas ist schief gelaufen"

Mit der Konsole:

Funktionen: Beginn der Ausführung von "createScream"
Fehler: Das eingehende JSON-Objekt enthält kein Feld client_email

Das Tutorial stammt von FreeCodeCamp - https://www.youtube.com/watch?v=m_u6P5k0vP0

Firebase-Konsole> Einstellungen (Zahnradsymbol)> Benutzer und Berechtigungen> Dienstkonten

Neuen Schlüssel generieren.

Fügen Sie json zu Ihrem Projektordner hinzu.

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"
});

Die json-Datei des Dienstkontos stellt Ihre Firebase-Dienste und -Funktionen Ihrem Projekt zur Verfügung.
Es sollte immer privat sein. Datei in .gitignore aufnehmen

Firebase-Konsole> Einstellungen (Zahnradsymbol)> Benutzer und Berechtigungen> Dienstkonten

Neuen Schlüssel generieren.

Fügen Sie json zu Ihrem Projektordner hinzu.

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"
});

Die json-Datei des Dienstkontos stellt Ihre Firebase-Dienste und -Funktionen Ihrem Projekt zur Verfügung.
Es sollte immer privat sein. Datei in .gitignore aufnehmen


Danke phtn, geschätzt - Ich habe Ihre Anweisungen befolgt, aber jetzt erhalte ich den Fehler

Error: Error occurred while parsing your function triggers.

Seltsamerweise funktioniert beim Ausführen von 'firebase deploy' alles: '

serviceAccountKey.json sollte sich im Verzeichnis /functions .

Das firebase deploy --only functions wird sich beschweren, wenn es draußen ist.

Nochmals vielen Dank (für die Geduld!). Mein serviceAccountKey.json befindet sich im Ordner / functions (siehe Screenshot unter dem folgenden Link).

Es scheint, dass es drei Möglichkeiten gibt, App zu initiieren ... Ich habe alle drei einzeln ausprobiert und keine scheint zu funktionieren - ich habe das Gefühl, dass dies etwas Verrücktes sein wird, das mir fehlt.

D.

Screen Grab:
Screenshot 2019-07-10 at 09 22 32

Wir haben das gleiche Problem am Ende. Wir initialisieren Firebase unter diesem Modell:

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

Lassen Sie mich wissen, ob wir Ihnen helfen können, dies aufzuspüren.

Jeder in diesem Thread. Wir haben eine Lösung gefunden. Wir haben die Firebase-Tools von 7.0.2 auf 7.0.1 herabgestuft und einen völlig anderen Fehler erhalten (etwas, weil wir keine Standardanmeldeinformationen laden konnten).

Also rannten wir weiter:

gcloud auth application-default login

Dies hat unser Problem behoben

@ryanhornberger Sie könnten Ihr Problem indem Sie

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

Ich habe eine Lösung dafür in # 1459

@samtstern danke!

Jeder in diesem Thread. Wir haben eine Lösung gefunden. Wir haben die Firebase-Tools von 7.0.2 auf 7.0.1 herabgestuft und einen völlig anderen Fehler erhalten (etwas, weil wir keine Standardanmeldeinformationen laden konnten).

Also rannten wir weiter:

gcloud auth application-default login

Dies hat unser Problem behoben

Das funktioniert bei mir. Ich habe die Firebase-Tools anfangs auf 7.1 aktualisiert. Ich habe den gleichen Fehler erhalten, als ich in meinem lokalen 'Firebase-Serve' ausgeführt habe. Es funktioniert jedoch einwandfrei, wenn ich auf Firebase bereitgestellt habe. Ein Downgrade auf 7.0.1 funktioniert für mich in meiner Region.

Gleiches Problem mit 7.1

Wir arbeiten an einem Fix, aber er ist noch nicht fertig:
https://github.com/firebase/firebase-tools/pull/1479

Ich bleibe bitte dabei, irgendein Ausweg?

Ein Downgrade auf 7.0.1 hat mir nicht geholfen

Ein Fix dafür wurde in # 1479 zusammengeführt und wird in der nächsten Version enthalten sein (also 7.2.0 )

Hey @samtstern , ich bin

Zuerst erhalte ich die folgende Warnung, wenn firebase emulators:exec "npm run test" :

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

Obwohl ich früher im Befehl sehen kann, dass der Emulator gestartet wird:

~/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

Die Aktualisierung der Produktions-Firestore-Datenbank wird nicht aktualisiert. Vielleicht nur ein falsches Negativ?

Das andere Problem ist, dass ich immer noch den Fehler erhalte. Ich habe $GOOGLE_APPLICATION_CREDENTIALS nicht festgelegt, aber laut https://firebase.google.com/docs/functions/local-emulator#set_up_admin_credentials_optional sollte bereits eine ausreichende Berechtigung vorhanden sein, wenn nur auf den Firestore zugegriffen wird:

Cloud Firestore- und Realtime Database-Trigger verfügen bereits über ausreichende Anmeldeinformationen und erfordern keine zusätzliche Einrichtung.

Ich initialisiere den Admin SDK ohne Parameter mit admin.initializeApp(); Vielleicht mache ich etwas falsch?

@noelmansour danke, dass Sie dies gemeldet haben (und master ausprobiert haben!) Können Sie den Code Ihrer Hauptfunktionsdatei anzeigen?

Mit ziemlicher Sicherheit ein falsches Negativ, aber ein wichtiges, das wir beheben müssen.

Es ist ziemlich minimal, da es nur aus anderen Dateien exportiert wird:

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";

Eigentlich scheint es ein Problem mit meinem Testaufbau zu sein. Beim Ausführen von firebase emulators:start die Warnung nicht angezeigt.

@noelmansour Wie sehen deine Tests aus? Könnten Sie auch ein neues Problem einreichen, um dies zu diskutieren, damit wir nicht alle in diesem Thread spammen>

Ja natürlich. Entschuldigen Sie. # 1530 geöffnet

Jeder in diesem Thread. Wir haben eine Lösung gefunden. Wir haben die Firebase-Tools von 7.0.2 auf 7.0.1 herabgestuft und einen völlig anderen Fehler erhalten (etwas, weil wir keine Standardanmeldeinformationen laden konnten).
Also rannten wir weiter:

gcloud auth application-default login

Dies hat unser Problem behoben

Das funktioniert bei mir. Ich habe die Firebase-Tools anfangs auf 7.1 aktualisiert. Ich habe den gleichen Fehler erhalten, als ich in meinem lokalen 'Firebase-Serve' ausgeführt habe. Es funktioniert jedoch einwandfrei, wenn ich auf Firebase bereitgestellt habe. Ein Downgrade auf 7.0.1 funktioniert für mich in meiner Region.

Könnten Sie bitte sagen, wie man die Firebase-Version herunterstuft? Meine aktuelle Version ist 7.0.2, dann habe ich versucht, npm i [email protected] -g this zu installieren. aber immer noch ist meine Version 7.0.2. Wie kann man pls Hilfe herabstufen?

Die vollständige Lösung für dieses Problem wurde in 7.2.0 :

npm install -g [email protected]

Wenn bei dieser Version immer noch ein ähnlicher Fehler auftritt, öffnen Sie bitte ein neues Problem.

Das gleiche Problem mit Firebase-Funktionen. Bereits versucht, npm -g [email protected] zu

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

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

Das gleiche Problem mit Firebase-Funktionen. Bereits versucht, npm -g [email protected] zu

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

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

Die folgende Lösung hat bei mir funktioniert:

// 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"
    })
});
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen