6
votes

Pourquoi le dernier serveur Firebase ne peut plus charger les informations d'identification par défaut

Je suis actuellement ce tutoriel sur youtube et à environ 26 minutes, l'auteur exécute ses fonctions localement avec la commande firebase serve .

Cela fonctionne bien pour lui, mais dès que j'essaye de le faire, j'obtiens l'erreur suivante:

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

Maintenant, l'erreur me donne un lien qui m'aide à résoudre cette erreur, en définissant une variable d'environnement dans mes fenêtres (ce que je n'aime pas, car cela et comment cela fonctionnera-t-il lorsque je développerai dans différents projets liés à différents comptes Gmail?)

Une autre solution que j'ai trouvée, mais pas encore testée, consiste à m'authentifier localement avec une commande gcloud auth application-default login .

Aucune de ces étapes n'est effectuée par l'auteur du didacticiel.

J'ai cherché dans les commentaires de la vidéo et quelqu'un a mentionné que cela avait à voir avec les versions de firebase-tools. Sa solution était de revenir à la version 6.8.0 de firebase-tools alors que la dernière actuelle est la 7.2.2.

Je me demande donc ce qui a changé le service Firebase avec firebase-tools 7.2.2 n'est plus capable d'exécuter une fonction cloud lorsque la fonction cloud essaie de stocker quelque chose dans une base de données firestore distante alors que cela fonctionnait avec firebase-tools 6.8. 0?

Et cela fonctionnera-t-il un jour avec la version 7.2.2 ou supérieure comme il le faisait avec la version 6.8.0?


2 commentaires

Il semble que ce soit un cas congruent. Puis-je vous demander si vous l'avez déjà résolu?


@Philipp voyez ma réponse, j'espère que cela vous aidera!


4 Réponses :


0
votes

Utilisez firebase login ... voir la référence CLI

(on peut les déployer avec firebase et avec gcloud ).


1 commentaires

lors de la création d'un nouveau projet (firebase init), une connexion doit également être effectuée avant l'étape d'initialisation pour qu'un projet puisse être sélectionné. Donc je suis déjà connecté. Mais pour être sûr, j'ai mis à jour les outils firebase vers 7.2.2 (pas encore de nouvelle version donc celle-ci a 18 jours) et j'ai fait une connexion firebase comme vous l'avez suggéré. J'ai reçu un message disant que je suis déjà connecté. J'ai donc fait un service Firebase et, étonnamment, cela fonctionne maintenant, ce à quoi je ne m'attendais pas. Je ne le comprends pas non plus car la connexion ne m'a montré que le message, aucune procédure de connexion n'a été lancée. Jusqu'à présent, cela me semble magique maintenant.



0
votes

Envisagez de définir la variable d'environnement pour fournir les informations d'identification nécessaires.

La définition de la variable d'environnement vous permet de fournir des informations d'identification séparément de votre application, sans apporter de modifications au code de l'application lors du déploiement.

Il n'est pas dit que la variable d'environnement est permanente, vous pourrez donc la remplacer ou la modifier par la suite.


2 commentaires

C'est vrai, mais que se passe-t-il si vous travaillez simultanément sur 2 projets différents ou plus, en utilisant 2 comptes Gmail différents? Avez-vous besoin de changer la valeur de la variable d'environnement tout le temps ou existe-t-il une autre astuce pratique pour éviter cela?


Le chemin de la variable d'environnement est utilisé uniquement pour votre session de terminal en cours. Si vous avez besoin d'accéder à différents projets, vous pouvez définir des comptes de service pour accéder à vos projets. Vous pouvez avoir un compte de service pour les deux projets ou un compte de service pour chaque projet.



1
votes

Pour toute personne ayant ce problème, vous pouvez voir ma réponse ici

Le problème vient des promesses non tenues. Les fonctions se terminent une fois terminées et n'attendent pas les rappels, et Firebase Cloud Functions n'autorise pas l'accès au processeur une fois qu'il se termine.


0 commentaires

1
votes

J'ai rencontré le même problème. Si vous souhaitez publier des données, le code du didacticiel fonctionne. Mais si vous souhaitez récupérer des données de la base de données, vous devez modifier quelques lignes de votre code.

Code de l'auteur du didacticiel:

const functions = require('firebase-functions');
const express = require('express');
const app = express();
const admin = require('firebase-admin');
const serviceAccount = require('../path/to/privKey.js');
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: 'https://project-name.firebaseio.com'
});


app.get('/screams', (req, res) => {
    console.log("I am here");
    admin.firestore()
    .collection('screams')
    .get()
    .then(data => {
        const screams = [];

        data.docs.map(doc => {
        screams.push({
            screamdId : doc.id,
            content : doc.data().content,
            createdAt : doc.data().createdAt,
            username : doc.data().username,
            likeCount : doc.data().likeCount,
            commentCount : doc.data().commentCount
        });
    });
    res.json({message : "Screams displayed successfully", data : screams});
    })
    .catch(err => {
        res.status(500).json({message : "Some Error occured"});
    });
});

exports.api = functions.https.onRequest(app);

Après les modifications:

const functions = require('firebase-functions');
const express = require('express');
const app = express();
const admin = require('firebase-admin');
admin.initializeApp();

app.get('/screams', (req, res) => {
    admin
    .firestore()
    .collection('screams')
    .get()
    .then(data => {
        const screams = [];
        data.map(doc => {
        screams.push({
            screamdId : doc.id,
            content : doc.data().content,
            createdAt : doc.data().createdAt,
            username : doc.data().username,
            likeCount : doc.data().likeCount,
            commentCount : doc.data().commentCount
        });
    });
    res.json({message : "Screams displayed successfully", data : screams});
    })
    .catch(err => {});
});

exports.api = functions.https.onRequest(app);

Remarque: get().then(data => {}) "data" ne vous renverra pas un tableau de documents de collection. Vous devez appeler data.docs.map(doc => {}) . Sinon, il dira "data.map () n'est pas une fonction".


0 commentaires