Firebase-tools: "Error: el objeto JSON entrante no contiene un campo client_email" después de actualizar a 7.0.2

Creado en 28 jun. 2019  ·  61Comentarios  ·  Fuente: firebase/firebase-tools

[OBLIGATORIO] Información del entorno


firebase-tools: 7.0.2


Plataforma: Oracle Linux Server 7.6, Node 10.15

[REQUERIDO] Caso de prueba


emular la función https con "firebase-admin": "^ 8.2.0", "firebase-functions": "^ 3.0.2"

[REQUERIDO] Pasos para reproducir

ejecutar cualquier función https con funciones de base de fuego : shell

[REQUERIDO] Comportamiento esperado

sin error (firebase-tools 7.0.0 no arroja ningún error)

[REQUERIDO] Comportamiento real

Solicitud enviada para funcionar.

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

Comentario más útil

_Descargo de responsabilidad: no estoy seguro de qué tan relacionado estaba mi problema con este de aquí, pero al menos puedo dejar mi información aquí, ya que podría ayudar a algunos de ustedes.

Tuve lo mismo en una función de base de fuego que intenta actualizar algún documento en la base de datos de Firestore por lotes. (No probé sin lote).

Esta es la pila de llamadas:

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

Estaba ejecutando mi función localmente usando la línea de comando:
firebase functions:shell

Estaba usando este código:

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

Cambié la linea
admin.initializeApp();
a
admin.initializeApp({ credential: admin.credential.applicationDefault() });
y ahora pude llamar a mi función localmente usando:

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

Consulte los documentos de admin.credential.applicationDefault ()

Todos 61 comentarios

@noelmansour gracias por lo que parece que algo entre 7.0.1 y 7.0.2 causó esto, veré los cambios realizados.

También estoy experimentando este problema desde 7.0.2

Acabo de actualizar a 7.0.2, viendo esto también. Verifiqué las credenciales de mi cuenta y el campo client_email está presente.

¿Alguien podría compartir el código de una función que está intentando ejecutar en el emulador que falla con este error? Cuanto más simple, mejor.

@samtstern El siguiente código me falla:

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

Solo funciona si configuro una cuenta de servicio al llamar a admin.initializeApp() :

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

@wceolin ¡ gracias por eso! ¿Puedes ejecutar lo siguiente dentro de tu directorio de funciones?

$ npm list @google-cloud/firestore

Este es mi resultado (y todo funciona para mí):

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

Obtuve el mismo resultado: 🤔

Screen Shot 2019-07-01 at 15 44 35

Así que estoy subiendo por el seguimiento de la pila de errores y en esta función:
https://github.com/googleapis/gax-nodejs/blob/e1be4ebcc2287c61d5f1884033449e3b4e143242/src/grpc.ts#L141

Tenemos esta ramificación:

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

En mi código opts.sslCreds está definido, así que llegué a esta rama:

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

Es la otra rama la que intenta reunir las credenciales y causa problemas. Ahora necesito averiguar por qué mi código va en un sentido y el tuyo en otro.

@wceolin, ¿ podría acceder a su carpeta node_modules y editar este archivo functions/node_modules/google-gax/build/src/grpc.js para tener un console.log() que imprima el objeto options en el createStub función y déjame saber lo que ves?

¡Gracias por su ayuda hasta ahora!

@samtstern No estoy seguro de si esto ayuda, pero hice algunos ajustes con mi package.json y node_modules durante el fin de semana. Ya no tengo el problema en 7.0.2.

La salida npm list @google-cloud/firestore coincide con la suya.

Nuked mi directorio node_modules durante el fin de semana, así que me pregunto si eso está relacionado.

@noelmansour gracias por esa nota, explica por qué no puedo reproducir en una configuración limpia.

@noelmansour También intenté eliminar mi node_modules , yarn.lock , eliminando dependencias pero no funcionó para mí. Intentaré crear un proyecto desde cero para ver qué pasa.

@noelmansour esto es lo que obtuve del objeto 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 gracias, eso es extremadamente útil porque así es como se ve el mío (y cómo debería verse):

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

Como puede ver, su cliente todavía está intentando acceder a la producción y luego falla porque el emulador de funciones no está autorizado para hacerlo.

¿También está ejecutando el emulador de firestore? ¿Su objetivo es escribir en el emulador de firestore o realmente desea escribir en firestore de producción?

¡OH, FINALMENTE Pude REPRODUCIR ESTO! Si ejecuto firebase emulators:start --only functions entonces trato de escribir en Firestore y obtengo este error.

Veo este mensaje de registro:

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

Lo cual ya no es exactamente correcto (el error es sobre client_email) pero la detección sigue siendo correcta. ¿Otros aquí también ven esta advertencia?

Aquí hay más información que puede ayudar. Durante el fin de semana, también configuré explícitamente la variable env del emulador de firestore en mi .zshrc:

export FIRESTORE_EMULATOR_HOST="localhost:8080"

Cuando lo elimino, aparece el error. Y esto es con el comando firebase emulators:start

@noelmansour, ¿puedes ejecutar ese comando con --debug y adjuntar los registros aquí como un archivo txt ?

@samtstern a veces estaba usando el emulador para servir una función HTTP localmente que establece algunos datos en producción (generalmente para hacer una migración de datos). Estoy usando:

firebase serve --only functions --project myProjectAlias

No estoy seguro de si se suponía que debía funcionar así (permitiéndonos escribir datos en producción) pero solía funcionar. 😅

@wceolin no se suponía que funcionara así con initializeApp() en versiones después de 6.8.0 . También tengo ese caso de uso, pero queremos encontrar una manera de hacer esa opción para que el valor predeterminado sea proteger la producción.

¡Pero me alegra saber de dónde viene este error ahora!

@samtstern Solo para confirmar, ejecute firebase emulators:start --debug con FIRESTORE_EMULATOR_HOST no configurado, ¿correcto?

¡Correcto!

El lunes 1 de julio de 2019 a las 12:28 p.m. Noel Mansour [email protected] escribió:

@samtstern https://github.com/samtstern Solo para confirmar, ejecute firebase
emuladores: start --debug con FIRESTORE_EMULATOR_HOST no configurado, ¿correcto?

-
Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/firebase/firebase-tools/issues/1451?email_source=notifications&email_token=ACATB2WV27VPIODNLGFS4TLP5JLGBA5CNFSM4H4GTWI2YY3PNVWWWK3TUL52HS4DFVREXWG43WK2VMV ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/ACATB2WG4EAD5KU7YRB5AUTP5JLGBANCNFSM4H4GTWIQ
.

Aquí está.

Para su información, eliminé el ID del proyecto de esta línea (no creo que importe):
[2019-07-01T19:32:42.859Z] >>> HTTP REQUEST GET https://mobilesdk-pa.googleapis.com/v1/projects/<project-id>:getServerAppConfig

debug.txt

También vale la pena mencionar, sin exportar la variable env, [email protected] me da este error:

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

Gracias @noelmansour por esos registros. ¿Le importaría mostrar el código de sus funciones también?

Es un poco complicado porque prefiero no compartir todas mis funciones, y no tengo tiempo en este momento para verificar que de forma aislada esto reproducirá el error, pero aquí está la función de saludo que he estado ejecutando:

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 ¡ gracias! Eso me acaba de revelar un error. Estas dos cosas deberían ser idénticas pero no lo son:

Opción 1

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

opcion 2

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

Sí, eso me arregló. ¡Gracias!

También tengo el error Error: The incoming JSON object does not contain a client_email field . No se pudo arreglar.

Código predeterminado:

import { initializeApp } from 'firebase-admin';

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

Otro intento:

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

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

Otro intento:

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 ¿Qué comando estás usando para ejecutar los emuladores? ¿Puede mostrar el comando y los registros de su ejecución con la bandera --debug ?

_Descargo de responsabilidad: no estoy seguro de qué tan relacionado estaba mi problema con este de aquí, pero al menos puedo dejar mi información aquí, ya que podría ayudar a algunos de ustedes.

Tuve lo mismo en una función de base de fuego que intenta actualizar algún documento en la base de datos de Firestore por lotes. (No probé sin lote).

Esta es la pila de llamadas:

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

Estaba ejecutando mi función localmente usando la línea de comando:
firebase functions:shell

Estaba usando este código:

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

Cambié la linea
admin.initializeApp();
a
admin.initializeApp({ credential: admin.credential.applicationDefault() });
y ahora pude llamar a mi función localmente usando:

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

Consulte los documentos de admin.credential.applicationDefault ()

@samtstern

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

Respecto a los logs, hoy no puede ser, ¡lo siento!

Cambié la linea
admin.initializeApp();
a
admin.initializeApp({ credential: admin.credential.applicationDefault() });

Esto funcionó para mí. Estoy ejecutando funciones localmente a través de:
firebase serve --only functions

No me queda claro si esto es seguro para la producción. Según los documentos, parece que le daría acceso de administrador al código que se ejecuta en producción, pero eso es cierto de todos modos.

@ ralphsmith80 aah probablemente tengas razón:

Encontrar credenciales automáticamente
Las bibliotecas cliente de GCP usan una estrategia llamada Credenciales predeterminadas de la aplicación (ADC) para encontrar las credenciales de tu aplicación. Cuando su código usa una biblioteca cliente, la estrategia busca sus credenciales en el siguiente orden:

Primero, ADC verifica si la variable de entorno GOOGLE_APPLICATION_CREDENTIALS está configurada. Si la variable está establecida, ADC usa el archivo de cuenta de servicio al que apunta la variable. La siguiente sección describe cómo configurar la variable de entorno.

Si no se establece la variable de entorno, ADC usa la cuenta de servicio predeterminada que proporcionan Compute Engine, Kubernetes Engine, App Engine y Cloud Functions para las aplicaciones que se ejecutan en esos servicios.

Si ADC no puede utilizar ninguna de las credenciales anteriores, se produce un error.

Esta estrategia es útil al probar y experimentar, pero puede dificultar saber qué credenciales está usando su aplicación.

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

Cambié la linea
admin.initializeApp();
a
admin.initializeApp({ credential: admin.credential.applicationDefault() });

Este método crea un error completamente nuevo para mí.

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)

También estoy inicializando la tienda como dijiste en el n. ° 1454

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

Con la credencial agregada a initializeApp , obtengo el error anterior.
Sin él, todavía lo consigo;

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)

Recibo este mismo error en un tutorial básico (el tutorial es de junio de 2019), por lo que este error parece bastante nuevo ...

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

});


Cuando ejecuto el punto final en Postman, aparece el mensaje de error

"error": "Ups, algo salió mal"

Con la consola indicando:

Funciones: Inicio de la ejecución de "createScream"
Error: el objeto JSON entrante no contiene un campo client_email

El tutorial es de FreeCodeCamp: https://www.youtube.com/watch?v=m_u6P5k0vP0

Firebase Console> Configuración (icono de engranaje)> Usuarios y permisos> Cuentas de servicio

Genere nueva clave.

Agregue json a la carpeta de su proyecto.

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

El archivo json de la cuenta de servicio hace que sus servicios y funciones de firebase estén disponibles para su proyecto.
Siempre debe ser privado. Incluir archivo en .gitignore

Firebase Console> Configuración (icono de engranaje)> Usuarios y permisos> Cuentas de servicio

Genere nueva clave.

Agregue json a la carpeta de su proyecto.

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

El archivo json de la cuenta de servicio hace que sus servicios y funciones de firebase estén disponibles para su proyecto.
Siempre debe ser privado. Incluir archivo en .gitignore


Gracias phtn, apreciado - Seguí tus instrucciones pero ahora recibo el error

Error: Error occurred while parsing your function triggers.

Extrañamente, cuando ejecuto 'firebase deploy', todo funciona en: ' https: //europe-west1-myapp.cloudfunctions.net/api / ... - ¿simplemente NO en localhost?

serviceAccountKey.json debe estar en el directorio /functions .

el firebase deploy --only functions se quejará si está afuera.

Gracias de nuevo (¡por ser tan paciente!). Mi serviceAccountKey.json está en la carpeta / functions (ver captura de pantalla en el enlace a continuación).

Parece que hay tres formas de initilizeApp ... He probado las tres individualmente y ninguna parece funcionar. Tengo la sensación de que me estoy perdiendo algo muy simple.

re

Captura de pantalla:
Screenshot 2019-07-10 at 09 22 32

Estamos teniendo el mismo problema por nuestra parte. Estamos inicializando firebase bajo este modelo:

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

Avíseme si podemos proporcionarle algo para ayudarlo a rastrear esto.

Todos en este hilo. Descubrimos una solución. Bajamos la calificación de firebase-tools de 7.0.2 a 7.0.1 y recibimos un error completamente diferente (algo sobre no poder cargar las credenciales predeterminadas).

Así que continuamos ejecutando:

gcloud auth application-default login

Esto solucionó nuestro problema

@ryanhornberger , podría

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

Tengo una solución para eso que viene en el n. ° 1459

@samtstern ¡ gracias!

Todos en este hilo. Descubrimos una solución. Bajamos la calificación de firebase-tools de 7.0.2 a 7.0.1 y recibimos un error completamente diferente (algo sobre no poder cargar las credenciales predeterminadas).

Así que continuamos ejecutando:

gcloud auth application-default login

Esto solucionó nuestro problema

Esto funciona para mi. Inicialmente actualicé firebase-tools a 7.1, obtuve el 'mismo error' cuando ejecuto 'firebase serve' en mi local. Sin embargo, funciona bien si lo implementé en firebase. La degradación a 7.0.1 funciona para mí en mi archivo local.

Mismo problema con 7.1

Estamos trabajando en una solución, pero aún no está lista:
https://github.com/firebase/firebase-tools/pull/1479

Estoy atrapado con esto por favor, ¿alguna salida?

rebajar a 7.0.1 no me ayudó

Una solución para esto se fusionó en # 1479 y se incluirá en la próxima versión (por lo que 7.2.0 )

Hola @samtstern , no estoy seguro de si es algo que estoy haciendo incorrectamente, o quizás un par de problemas nuevos, pero he notado un par de cosas que ejecutan las herramientas del último maestro (dad143c42445056014f6f48cc9dfa13156e3c186).

Primero, recibo la siguiente advertencia cuando ejecuto firebase emulators:exec "npm run test" :

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

Aunque anteriormente en el comando puedo ver que inicia el emulador:

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

En realidad, no está actualizando la base de datos de producción de firestore. ¿Quizás solo un falso negativo?

El otro problema es que sigo recibiendo el error. No configuré $GOOGLE_APPLICATION_CREDENTIALS , pero de acuerdo con https://firebase.google.com/docs/functions/local-emulator#set_up_admin_credentials_optional , ya debería haber suficiente permiso si solo se accede a firestore:

Los activadores de Cloud Firestore y Realtime Database ya tienen suficientes credenciales y no requieren configuración adicional.

Estoy inicializando el sdk de administrador sin ningún parámetro usando admin.initializeApp(); Quizás algo que estoy haciendo incorrectamente?

@noelmansour gracias por informar de esto (y por probar master !) ¿Puedes mostrar el código de tu archivo de funciones principales?

Casi con certeza un falso negativo, pero uno importante que debemos corregir.

Es bastante mínimo, ya que solo se exporta desde otros archivos:

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

En realidad, parece ser un problema con la configuración de mi prueba. Cuando ejecuto firebase emulators:start no veo la advertencia.

@noelmansour ¿cómo son tus pruebas? También podría presentar un nuevo problema para discutir esto para que no enviemos spam a todos en este hilo>

Sí, por supuesto. Mis disculpas. # 1530 abierto

Todos en este hilo. Descubrimos una solución. Bajamos la calificación de firebase-tools de 7.0.2 a 7.0.1 y recibimos un error completamente diferente (algo sobre no poder cargar las credenciales predeterminadas).
Así que continuamos ejecutando:

gcloud auth application-default login

Esto solucionó nuestro problema

Esto funciona para mi. Inicialmente actualicé firebase-tools a 7.1, obtuve el 'mismo error' cuando ejecuto 'firebase serve' en mi local. Sin embargo, funciona bien si lo implementé en firebase. La degradación a 7.0.1 funciona para mí en mi archivo local.

¿Podría decirnos cómo degradar la versión de base de fuego? Mi versión actual es 7.0.2, luego intenté instalar npm i [email protected] -g this. pero aún así mi versión es 7.0.2. ¿Cómo degradar la ayuda de los pls?

La solución completa para este problema se ha publicado en 7.2.0 :

npm install -g [email protected]

Si aún experimenta un error similar en esa versión, abra un nuevo problema.

Tener este mismo problema con las funciones de Firebase. Ya probé npm install -g [email protected] dando

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

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

Tener este mismo problema con las funciones de Firebase. Ya probé npm install -g [email protected] dando

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

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

La siguiente solución funcionó para mí:

// 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"
    })
});
¿Fue útil esta página
0 / 5 - 0 calificaciones