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