javascript - El objeto JSON entrante no contiene un campo client_email
firebase google-cloud-functions (5)
Probablemente necesite configurar el SDK de administración de Firebase para usar el emulador de Firebase.
Puede hacerlo pasando una propiedad de
credential
al llamar al método
admin.initializeApp()
:
const serviceAccount = require(''../serviceAccount.json'');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});
Puede descargar el archivo JSON de su cuenta de servicio en la consola Firebase:
- Haga clic en el icono de "configuración";
- Ir a "Usuarios y permisos";
- Haga clic en el enlace donde dice "Las cuentas de servicio N también tienen acceso a este proyecto";
- Haga clic en el botón "Generar nueva clave privada".
Estoy tratando de crear una función de nube base de fuego. Así que me gustaría ejecutar mi función de nube base de fuego localmente. Pero no funciona cómo configurar la autenticación.
He instalado herramientas de base de fuego:
https://firebase.google.com/docs/functions/local-emulator
He
firebase login
el comando de
firebase login
, así que ahora estoy registrado.
Luego, he creado mi clave json con este tutorial:
https://cloud.google.com/docs/authentication/getting-started
Ahora si
echo $GOOGLE_APPLICATION_CREDENTIALS
el resultado es
/home/$USER/.google/****.json
que contienen
"project_id","private_key_id","private_key","client_email", "client_id", "auth_uri", "token_uri", "auth_provider_x509_cert_url", "client_x509_cert_url"
También intenté instalar el sdk completo de google cloud y
gcloud auth application-default login
: el
gcloud auth application-default login
pero no
gcloud auth application-default login
éxito.
Versiones del paquete Npm:
"firebase-functions":"3.0.2"
"firebase-admin": "8.2.0"
Creo que he proporcionado suficiente información, pero no dude en preguntarme más si lo desea.
const functions = require("firebase-functions");
const admin = require("firebase-admin");
const express = require("express");
const app = express();
app.get("/", async (req, res) => {
admin.firestore().collection(''something'').get().then((collection) =>
return res.send({"count": collection.docs.length, "status": 200});
});
exports.exports = functions.https.onRequest(app);
el código no es importante, lo más importante es que incluso he realizado todos estos pasos, cuando emulo mi base de fuego localmente con el
firebase serve
base de
firebase serve
y desencadené una función, tengo este error: Error: el objeto JSON entrante no contiene un campo de client_email
Puedo asegurarte que el archivo json contiene el campo client_email.
¿Puedes ayudarme a autenticarme con google?
Gracias por tu ayuda.
Tuve un problema similar.
Es probable que sea un error en la versión
7.0.2
de
firebase-tools
.
Volví a la versión
7.0.0
y ahora funciona.
Así que la solución temporal es:
npm i [email protected] -g
Una vez que haya creado un proyecto Firebase, puede iniciar el SDK con una estrategia de autorización que combine el archivo de su cuenta de servicio junto con las Credenciales predeterminadas de la aplicación de Google.
Para autenticar una cuenta de servicio y autorizarla a acceder a los servicios de Firebase, debe generar un archivo de clave privada en formato JSON.
Para generar un archivo de clave privada para su cuenta de servicio:
-
En la consola de Firebase, abra Configuración> Cuentas de servicio.
-
Haga clic en Generar nueva clave privada, luego confirme haciendo clic en Generar clave.
-
Almacene de forma segura el archivo JSON que contiene la clave.
Establezca la variable de entorno GOOGLE_APPLICATION_CREDENTIALS en la ruta del archivo JSON que contiene su clave de cuenta de servicio. Esta variable solo se aplica a su sesión de shell actual, por lo que si abre una nueva sesión, establezca la variable nuevamente.
$env:GOOGLE_APPLICATION_CREDENTIALS="C:/Users/username/Downloads/service-account-file.json"
firebase emulators:start
este error al ejecutar los
firebase emulators:start
.
Según la investigación de este error: github.com/firebase/firebase-tools/issues/1451 , parece que este es un problema con la referencia a la aplicación directamente en lugar de a través del módulo de administración.
es decir, esto causa el error:
const app = admin.initializeApp();
const firestore = app.firestore();
pero esto no lo hace:
admin.initializeApp();
const firestore = admin.firestore();
Sin embargo, para la pregunta original, estás usando admin.firestore () para que ese no sea el problema.
Parece que
admin.initializeApp()
nunca se llama.
Quizás esa podría ser la causa de tu problema?
En breve:
admin.initializeApp({ credential: admin.credential.applicationDefault() });
Consulte los documentos para admin.credential.applicationDefault()
Un poco más de información.
Tuve lo mismo cuando intenté llamar a una función de base de fuego localmente, que intenta actualizar algunos documentos en la base de datos de firestore por lotes. (No probé sin lote).
Para comenzar a llamar a las funciones de Firebase localmente, uso:
firebase function:shell
Como probablemente sepa, esto lista las funciones disponibles para su proyecto.
Llamé a mi función y obtuve la siguiente pila de llamadas de error:
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 comandos:
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 mi función localmente:
firebase functions:shell
firebase > myCallableFirebaseFunction({from: "foo", to: "bar"})
Consulte los documentos para admin.credential.applicationDefault()