web-dev-qa-db-fra.com

Erreur: impossible de charger les informations d'identification par défaut (fonction Firebase pour Firestore)

J'essaie d'écrire une fonction onCall pour Firebase Cloud Functions qui effectue des tâches de requête avancées sur une base de données firestore (c.-à-d. Vérification d'une requête de texte par rapport à AutoML natural lang pour obtenir une catégorie, etc.) mais je rencontre toujours un problème en essayant d'interroger le base de données de la fonction:

Error getting documents ::  Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.
    at GoogleAuth.getApplicationDefaultAsync (/srv/node_modules/google-auth-library/build/src/auth/googleauth.js:161:19)
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)

Fonction:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();

exports.query = functions.https.onCall((data, context) => {
    const text = data.text;
    var results = [];
    const promise = db.collection('providers').get()
    promise.then((snapshot) => {
        console.log('marker');
        snapshot.forEach((doc) => {
            results.Push({id: doc.id, data: doc.data()});
        });
        console.log('yessir');
        return {results: results};
    }).catch((err) => {
        console.log('Error getting documents :: ', err)
        console.log('nosir');
        return {results: "no results"};
    });
});

Sortie plus longue:

Function execution started
Function execution took 8ms, finished with status code: 200
Error getting documents :: (etc, same error)
nosir

Exemple 2 (pas de changement de fonctionnement):

Function execution started
Function execution took 1200 ms, finished with status code: 200
marker
yessir

Je ne peux pas comprendre d'où vient ce problème ni comment le résoudre. De l'aide?

Cordialement.

37
BurnDownTheIgloo

J'ai eu la même erreur "Impossible de charger les informations d'identification par défaut".

L'erreur s'est produite après la mise à jour de mes dépendances de projet avec npm update. Plus précisément firebase-admin et firebase-functions .

Avant la mise à jour:

"dependencies": {
    "@google-cloud/firestore": "^1.3.0",
    "firebase-admin": "~7.0.0",
    "firebase-functions": "^2.2.0"
}

Après la mise à jour:

"dependencies": {
    "@google-cloud/firestore": "^1.3.0",
    "firebase-admin": "^8.6.0",
    "firebase-functions": "^3.3.0"
}

J'ai ajouté le serviceAccountKey.json à mon projet et a modifié les importations avec le code fourni dans le paramètre de compte de service de mon projet Firebase.

De :

var admin = require('firebase-admin')

admin.initializeApp()

À:

var admin = require('firebase-admin');    
var serviceAccount = require('path/to/serviceAccountKey.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: 'https://my-project.firebaseio.com'
});

Voir la réponse de @ Fernando Rocha ci-dessous pour accéder aux paramètres de compte de votre projet Firebase.

21
dperonnet

Ce que j'ai fait pour le résoudre, j'ai ajouté ma clé SDK admin Firebase à mon projet.

Je l'ai téléchargé sur

https://console.firebase.google.com/u/0/project/ YOUR_PROJECT_ID /settings/serviceaccounts/adminsdk

Admin SDK Key Download Page

puis à admin.initializeApp(); j'ai changé pour:

admin.initializeApp({
    credential: admin.credential.cert(require('../keys/admin.json'))
});

La structure de mon dossier est

├── key
│   ├── admin.json
├── src
│   ├── index.ts
50
Fernando Rocha

La réponse de @ aldobaie m'a aidé à comprendre ce qui se passait pour mon cas d'utilisation. Pour ceux qui ne cherchent pas à ajouter async/wait à tous leurs appels, rappelez-vous que les appels firestore renvoient des promesses, donc les ajouter avec return a le même effet.

Dans mon cas:

function doSomething(...) {
    return admin.firestore().collection(...).doc(...).get()
        .then((doc) => {...})
        .catch(err => {...})
}

module.exports = functions.firestore.document('collection/{docId}').onWrite((change, context) => {
    return doSomething()
})

Je pense que la réponse acceptée va à l'encontre de la configuration recommandée par Firebase. L'environnement de fonction a déjà accès aux informations d'identification d'administrateur, et il n'est pas recommandé de transmettre votre clé dans le code.

Je le fais comme ça:

const functions = require('firebase-functions')
const admin = require('firebase-admin')
admin.initializeApp(functions.config().firebase)
16
shadyhill

J'ai moi-même rencontré le même problème. Parfois, la fonction fonctionne et plusieurs fois elle le ferait par l'erreur Error: Could not load the default credentials. Je crois que le problème a été résolu en surveillant les rappels. Vous devez maintenir la fonction en cours d'exécution jusqu'à ce que les rappels aient été appelés à l'aide des préfixes await et async.

Les fonctions Cloud de Firebase ne permettent pas l'accès au processeur via des rappels une fois qu'il est terminé! C'est pourquoi nous obtenons l'erreur Error: Could not load the default credentials.

Donc, chaque fois que vous avez un .then() function préfixez-le avec await et préfixez la fonction qui s'y trouve avec async et préfixez tout appel à la fonction avec await .

async function registerUser(..) {
    ...
    await admin.firestore().collection(..)...
    ...
}

J'espère que cela vous aide!

11
aldobaie

Une autre option consiste à définir la clé de compte de service dans une variable d'environnement au lieu de la définir avec un appel à firebaseAdmin.initializeApp({ credential }).

Linux

export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/[FILE_NAME].json"

Windows PowerShell

$env:GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\[FILE_NAME].json"

Postscript: Une option encore meilleure pourrait être de tiliser la suite d'émulateurs locaux .

4
Shaun Luttin

Je ne veux pas utiliser la solution @Fernando même s'il n'y a rien de mal.

J'ai un environnement prd et non prd. J'utilise la commande d'utilisation de Firebase pour pousser les modifications dans l'environnement correct. Lorsque je déploie, Firebase utilise le compte de service par défaut. De plus, je ne veux pas avoir les clés dans le dossier du projet ou dans mon dépôt git.

La façon dont j'ai résolu pourrait ne pas fonctionner pour les autres, mais je veux partager ici.

Le problème m'est venu lorsque j'ai mis à jour l'autorisation du projet Firebase pour donner à un visualiseur une autorisation d'éditeur. J'ai fait de cette personne le propriétaire et je suis revenue à l'éditeur. Il est parti. Cela ne justifie pas comme solution, mais a fonctionné pour moi et je n'ai pas à télécharger la clé.

1
Narayanan

Aucune des choses ci-dessus. Vous pouvez simplement:

connexion firebase - Cela ouvrira la connexion du navigateur

Dès que vous vous connectez, revenez à la console et exécutez:

firebase init - Il fonctionnera comme un succès.

0
Gabriel Magaton

Téléchargez votre compte de service Firebase dans votre projet et référencez-le comme ceci:

<code>
  var admin = require("firebase-admin");
  var serviceAccount = require("path/to/serviceAccountKey.json");

  admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "<database-url>"
  });
</code>
0
George Aryee

Pour ceux qui viennent ici d'un serp essayant de comprendre pourquoi leur fonction google cloud échoue avec:

Erreur: impossible de charger les informations d'identification par défaut. Accédez à https://cloud.google.com/docs/authentication/getting-started pour plus d'informations. sur GoogleAuth.getApplicationDefaultAsync

mais rien de ce qui précède n'a aidé, vous pouvez essayer de mettre à jour tous (?) vos @google/whatever dépendances: npm i -E @google/firestore@latest. Reconstruisez, déployez, réessayez. Cela m'est arrivé plusieurs fois récemment et cela a fonctionné.

0
Evgeny Timoshenko

J'ai juste eu le même problème. Pour le résoudre, mettez simplement à jour vos packages de nœuds par npm update dans votre répertoire project-dir/functions /. Enfin, déployez à nouveau.

0
Juan Lopez

J'ai eu le même problème dans Firebase Erreur: "Impossible d'obtenir les informations d'identification par défaut."

Ensuite, accédez à console Firebase et accédez au paramètre de projet, où vous pouvez trouver l'option Comptes de service. Cliquez ici et vous verrez le Générer une nouvelle clé privée sous les paramètres de votre projet. Copiez le code de la langue de votre projet et ajoutez-le à votre fichier de projet.

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

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

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://your-database-url-that-is-given-under-admin-sdk-snippets"
});

Après avoir généré la clé, vous aurez la possibilité de télécharger. et le mettre dans le dossier du projet. Définissez également le chemin var serviceAccount = require("path/to/serviceAccountKey.json"); C'est tout, vous êtes prêt.

0
akshay_sushir