我在我的.env文件中使用app.js变量来访问密钥。在我下载了一个新的Firebase Service Account Private Key之前,一切都很顺利。当我用新值替换旧值时,我无法再访问键,因为在terminal中,当我运行node app.js时,我总是收到一条错误消息:
/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/auth/credential.js:129抛出新的error_1.FirebaseAppError(error_1.AppErrorCodes.INVALID_CREDENTIAL,‘未能解析私钥:’+error_1.FirebaseAppError(error_1.AppErrorCodes.INVALID_CREDENTIAL,);^ 错误:解析私钥失败:错误:无效的PEM格式化消息。在FirebaseAppError.FirebaseError 作为构造函数 at FirebaseAppError.PrefixedFirebaseError 作为构造函数 at new FirebaseAppError/firebase-admin/lib/auth/credential.js:192:64) at Object.cert (/Object.cert/Cpu/Desktop/.)在对象上。(/User/Cpu/Desktop/./app.js:14:32)在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作为构造函数npm ERR!代码ELIFECYCLE npm错误!错误号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-----\napp.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
});如何解决这个问题?
发布于 2018-05-16 16:43:20
问题在于,由于我在.env文件中使用了.env变量,所以FIREBASE_PRIVATE_KEY在其中有转义字符:\n。
为了解析它,我必须遵循这个答案并将.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
});发布于 2019-01-19 20:34:14
您必须将您的密钥添加到双qoutes中,以便根据dotenv文档允许扩展的新行选项。
您可以在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"发布于 2022-06-24 11:36:45
最新情况:2022年
如果有人仍然在寻找以下配置的解决方案,下面是我解决它的方法。
堆叠:
TypeScript特快专递
将整个JSON文件转换为BASE64
使用此链接可以转换Base64编码器,也可以使用任何其他工具。
在.env中添加编码的字符串
FIREBASE_API_KEY=<your_large_base64_string>下面是firebase-init.ts使用这些键的代码。
import * as admin from 'firebase-admin';
declare var process: {
env: {
FIREBASE_KEYS: string;
}
}
const initializeFirebaseAdmin = (isProd = true) => {
const firebase_private_key_b64 = Buffer.from(process.env.FIREBASE_KEYS, 'base64');
const firebase_private_key = firebase_private_key_b64.toString('utf8');
admin.initializeApp({
credential: admin.credential.cert(JSON.parse(firebase_private_key))
});
}
export { initializeFirebaseAdmin }https://stackoverflow.com/questions/50299329
复制相似问题