首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Node.js -Firebase服务帐户私钥不解析

Node.js -Firebase服务帐户私钥不解析
EN

Stack Overflow用户
提问于 2018-05-11 19:52:14
回答 5查看 27.4K关注 0票数 59

我在我的.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,但同样的问题也发生了。

新旧二等钥匙

代码语言:javascript
运行
复制
// 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文件:

代码语言:javascript
运行
复制
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文件:

代码语言:javascript
运行
复制
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
});

如何解决这个问题?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-05-16 16:43:20

问题在于,由于我在.env文件中使用了.env变量,所以FIREBASE_PRIVATE_KEY在其中有转义字符:\n

为了解析它,我必须遵循这个答案并将.replace(/\\n/g, '\n')追加到它的末尾:

代码语言:javascript
运行
复制
privateKey: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n')

所以现在代码看起来是:

代码语言:javascript
运行
复制
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
});
票数 186
EN

Stack Overflow用户

发布于 2019-01-19 20:34:14

您必须将您的密钥添加到双qoutes中,以便根据dotenv文档允许扩展的新行选项。

您可以在dotenv github中的Rules部分检查该选项。

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

代码语言:javascript
运行
复制
  FIREBASE_PROJECT_ID=wwwwwwww
  FIREBASE_CLIENT_EMAIL=xxxxxxxx
  FIREBASE_DATABASE_URL=yyyyyyyy
  FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nzzzzzzzz\n-----END PRIVATE KEY-----\n"
票数 38
EN

Stack Overflow用户

发布于 2022-06-24 11:36:45

最新情况:2022年

如果有人仍然在寻找以下配置的解决方案,下面是我解决它的方法。

堆叠:

TypeScript特快专递

将整个JSON文件转换为BASE64

使用此链接可以转换Base64编码器,也可以使用任何其他工具。

在.env中添加编码的字符串

代码语言:javascript
运行
复制
FIREBASE_API_KEY=<your_large_base64_string>

下面是firebase-init.ts使用这些键的代码。

代码语言:javascript
运行
复制
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 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50299329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档