web-dev-qa-db-fra.com

Node.js -La clé privée du compte de service Firebase ne sera pas analysée

J'utilise des variables .env dans mon fichier app.js pour accéder aux clés. Tout fonctionnait bien jusqu'à ce que je télécharge un nouveau Firebase Service Account Private Key. Lorsque j'ai remplacé l'ancienne valeur par la nouvelle, je ne peux plus accéder à la clé car, dans terminal lorsque j'exécute node app.js, le message d'erreur suivant s'affiche:

/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/auth/credential.js:129 jette new error_1.FirebaseAppError (error_1.AppErrorCodes.INVALID_CREDENTIAL, 'Impossible d'analyser la clé privée:' + error); ^

Erreur: Échec de l'analyse de la clé privée: Erreur: PEM non valide formaté message. at FirebaseAppError.FirebaseError [en tant que constructeur] (/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/utils/error.js:39:28) at FirebaseAppError.PrefixedFirebaseError [en tant que constructeur] (/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/utils/error.js:85:28) à la nouvelle FirebaseAppError (/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/utils/error.js:119:28) at new Certificate (/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/auth/credential.js:129:19) à la nouvelle CertCredential (/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/auth/credential.js:192:64) sur Object.cert (/Users/Cpu/Desktop/.....) à l'objet. (/Users/Cpu/Desktop/...../app.js:14:32) sur Module._compile (module.js: 571: 32) sur Object.Module._extensions..js (module.js: 580: 10) sur Module.load (module.js: 488: 32) sur FirebaseAppError.FirebaseError [en tant que constructeur] npm ERR! code ELIFECYCLE npm ERR! errno 1

Tout ce que je faisais était c + p le nouveau Private Key, puis ajouté et sauvegardé le fichier .env, poussé dans heroku, et cela ne fonctionne plus. J'ai même téléchargé un nouveau Private Key mais le même problème se produit.

Les anciennes et nouvelles clés privées

// old Private Key
-----BEGIN PRIVATE KEY-----\nbbbbbbbb\n-----END PRIVATE KEY-----\n

// new Private Key
-----BEGIN PRIVATE KEY-----\nzzzzzzzz\n-----END PRIVATE KEY-----\n

Le fichier .env:

FIREBASE_PROJECT_ID=wwwwwwww
FIREBASE_CLIENT_EMAIL=xxxxxxxx
FIREBASE_DATABASE_URL=yyyyyyyy
FIREBASE_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\nzzzzzzzz\n-----END PRIVATE KEY-----\n

Le fichier app.js:

const dotenv = require('dotenv');
dotenv.load();

var admin = require("firebase-admin");
admin.initializeApp({
  credential: admin.credential.cert({
      projectId: process.env.FIREBASE_PROJECT_ID,   // I get no error here
      clientEmail: process.env.FIREBASE_CLIENT_EMAIL,   // I get no error here
      privateKey: process.env.FIREBASE_PRIVATE_KEY   // I get error HERE
  }),
  databaseURL: process.env.FIREBASE_DATABASE_URL
});

Comment puis-je résoudre ce problème?

10
Lance Samaria

Le problème était que, depuis que j'ai utilisé des variables dotenv dans le fichier .env, le FIREBASE_PRIVATE_KEY avait des caractères d'échappement: \n à l'intérieur.

Je devais suivre cette réponse et ajouter .replace(/\\n/g, '\n') à la fin pour l’analyser:

privateKey: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n')

Alors maintenant, le code ressemble à:

admin.initializeApp({
  credential: admin.credential.cert({
      projectId: process.env.FIREBASE_PROJECT_ID, // I get no error here
      clientEmail: process.env.FIREBASE_CLIENT_EMAIL, // I get no error here
      privateKey: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n') // NOW THIS WORKS!!!
  }),
  databaseURL: process.env.FIREBASE_DATABASE_URL
});
23
Lance Samaria

Vous devez ajouter votre clé dans double qoutes pour permettre l’option de nouvelles lignes étendues conformément à la documentation dotenv.

Vous pouvez cocher cette option dans la section Règles de dotenv github. 

https://github.com/motdotla/dotenv#rules

  FIREBASE_PROJECT_ID=wwwwwwww
  FIREBASE_CLIENT_EMAIL=xxxxxxxx
  FIREBASE_DATABASE_URL=yyyyyyyy
  FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nzzzzzzzz\n-----END PRIVATE KEY-----\n"
0
Bryan Ramirez