我在app.js文件中使用.env
个变量来访问密钥。在我下载新的Firebase Service Account Private Key
之前,一切正常。当我用旧值替换旧值时,我无法再访问密钥,因为在terminal
运行node app.js
时,我不断收到错误消息:
/用户/ CPU /桌面/...../ node_modules /火力管理员/ LIB / AUTH / credential.js:129 抛出新的错误_1.FirebaseAppError(error_1.AppErrorCodes.INVALID_CREDENTIAL, '无法解析私钥:'+错误); ^
错误:无法解析私钥:错误:格式化的PEM无效 信息。 在FirebaseAppError.FirebaseError [作为构造函数](/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/utils/error.js:39:28) 在FirebaseAppError.PrefixedFirebaseError [作为构造函数](/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/utils/error.js:85:28) 在新的FirebaseAppError(/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/utils/error.js:119:28) 在新证书上(/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/auth/credential.js:129:19) 在新的CertCredential(/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/auth/credential.js:192:64) 在Object.cert(/ Users / Cpu / Desktop / .....) 在对象。 (/Users/Cpu/Desktop/...../app.js:14:32) 在Module._compile(module.js:571:32) at Object.Module._extensions..js(module.js:580:10) 在Module.load(module.js:488:32)处于FirebaseAppError.FirebaseError [作为构造函数] 错误的ERR!代码ELIFECYCLE npm ERR!错误1
我所做的只是c + p新Private Key
,然后添加它并保存.env
文件,推送到heroku,它不再有效。我甚至下载了一个新的Private Key
,但同样的问题也出现了。
旧的和新的私钥
// old Private Key
-----BEGIN PRIVATE KEY-----\nbbbbbbbb\n-----END PRIVATE KEY-----\n
// new Private Key
-----BEGIN PRIVATE KEY-----\nzzzzzzzz\n-----END PRIVATE KEY-----\n
.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
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
});
如何解决此问题?
答案 0 :(得分:29)
问题是因为我在dotenv
文件中使用了.env
个变量,FIREBASE_PRIVATE_KEY
内部有\n
个转义字符。{/ p>
我必须关注ROUND_HALF_UP
并将.replace(/\\n/g, '\n')
附加到其末尾才能解析它:
privateKey: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n')
所以现在代码看起来像:
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
});
答案 1 :(得分:1)
您必须根据dotenv
文档将密钥添加到双qoutes中,以允许扩展新行选项。
您可以在dotenv
github中的Rules部分检查该选项。
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"
答案 2 :(得分:-1)
在 Firebase > 设置> Admin SDK Firebase 下生成admin SDK Firebase。转到您项目中的Google Cloud Platform,单击 IAM管理员> 源帐户,然后在帐户服务中生成密钥代码(您的帐户服务是在admin SDK Firebase中生成的)。