Node.js -Firebase Service Account Private Key won't parse
Solution 1
The problem was since I used dotenv
variables inside the .env
file the FIREBASE_PRIVATE_KEY
had escaping characters: \n
inside of it.
I had to follow this answer and append .replace(/\\n/g, '\n')
to the end of it to parse it:
privateKey: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n')
So now the code looks like:
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
});
Solution 2
You must add your key into double qoutes to allow expanded new lines option according with dotenv
documentation.
You can check that option at Rules section in 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"
Lance Samaria
Self taught iOS developer from the Marble Hill section of the Bronx NY. ARKit novice but interested in advanced topics.
Updated on July 09, 2022Comments
-
Lance Samaria almost 2 years
I use
.env
variables in my app.js file to access the keys. Everything was working fine until I downloaded a newFirebase Service Account Private Key
. When I replaced the old value with the new value I can no longer access the key because interminal
when I runnode app.js
I keep getting an error message:/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/auth/credential.js:129 throw new error_1.FirebaseAppError(error_1.AppErrorCodes.INVALID_CREDENTIAL, 'Failed to parse private key: ' + error); ^
Error: Failed to parse private key: Error: Invalid PEM formatted message. at FirebaseAppError.FirebaseError [as constructor] (/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/utils/error.js:39:28) at FirebaseAppError.PrefixedFirebaseError [as constructor] (/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/utils/error.js:85:28) at new 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) at new CertCredential (/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/auth/credential.js:192:64) at Object.cert (/Users/Cpu/Desktop/.....) at Object. (/Users/Cpu/Desktop/...../app.js:14:32) at Module._compile (module.js:571:32) at Object.Module._extensions..js (module.js:580:10) at Module.load (module.js:488:32) at FirebaseAppError.FirebaseError [as constructor] npm ERR! code ELIFECYCLE npm ERR! errno 1
All I did was c+p the new
Private Key
and then added it and saved the.env
file, pushed to heroku, and it's no longer working. I even downloaded a newPrivate Key
but the same problem occurs.The old and new Private Keys
// old Private Key -----BEGIN PRIVATE KEY-----\nbbbbbbbb\n-----END PRIVATE KEY-----\n // new Private Key -----BEGIN PRIVATE KEY-----\nzzzzzzzz\n-----END PRIVATE KEY-----\n
The .env file:
FIREBASE_PROJECT_ID=wwwwwwww FIREBASE_CLIENT_EMAIL=xxxxxxxx FIREBASE_DATABASE_URL=yyyyyyyy FIREBASE_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\nzzzzzzzz\n-----END PRIVATE KEY-----\n
The app.js file:
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 });
How can I fix this issue?
-
Chadd over 5 yearsI'm having this problem after creating new keys in Firebase. I'm keeping the key values in Firebase Environmental Variables, so I shouldn't have to adjust for
\n
. When Ifirebase deploy --only functions
, I get the PEM error. Any suggestions? -
Lance Samaria over 5 yearsI never user Firebase env vars before. I wish I could help
-
Patrick Michaelsen over 5 yearsThis solved my issue. Strange thing was it worked without it, then suddenly stopped working. Anyway, voted this up for others to see.
-
Lance Samaria over 5 years@PatrickMichaelsen the same exact thing happened to me. It was working without it then for some strange after I changed to a new private key and tried again it no longer worked. Very odd. Anyway glad I could help and thanks for the upvote. Cheers!
-
The Geek over 4 yearsThank you! Works perfectly with firebase config variables. e.g accessing functions.config().var.name.replace(/\\n/g, '\n') (set via firebase functions:config:set var.name="xxx" ).
-
Piyush Pandey about 4 yearsit shows SyntaxError: Unexpected token o in JSON at position 1
-
Adnan Erkocevic almost 4 yearsI had to add: .replace(/\\\\n/g, '\n') in order to replace the //n correctly
-
Abishek Kumar almost 4 yearsI had same situation on AWS elastic beanstalk, I added
\\n
instead of\n
in the environment variables and added replace where I access them. -
Akash Kundu over 3 years@PiyushPandey I had the same issue. I'm using dotenv and I was requiring dotenv after the file i was using it in, so that fixed it for me. Might be unhelpful, but just letting you know that's what did it for me!
-
Jeff Voss over 2 yearsafter many days and nights I finally have success. I send you my deepest gratitudes
-
Alexander Hemming about 2 yearshad same problem, used the raplce but also had to add \n to the very start of the key