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

Posted

技术标签:

【中文标题】Node.js -Firebase 服务帐户私钥不会解析【英文标题】:Node.js -Firebase Service Account Private Key won't parse 【发布时间】:2018-10-22 06:49:46 【问题描述】:

我在 app.js 文件中使用 .env 变量来访问密钥。在我下载新的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); ^

错误:无法解析私钥:错误:无效的 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) 在 Object.Module._extensions..js (module.js:580:10) 在 Module.load (module.js:488:32) 在 FirebaseAppError.FirebaseError [作为构造函数] npm 错误!代码 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-----\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
);

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

Firebase > Settings > Admin SDK Firebase 下生成 admin SDK Firebase。在你的项目中进入谷歌云平台,点击IAM管理员 > Source account,在account service中生成key code(你的account service在admin SDK Firebase中生成)。

【讨论】:

【参考方案2】:

我相信 cert 函数正在等待 JSON 对象 尝试将密钥转换为 JSON,我认为它会起作用

credential: admin.credential.cert(JSON.parse(serviceAccountKey))

这对我有用!

【讨论】:

它显示 SyntaxError: Unexpected token o in JSON at position 1 @PiyushPandey 我有同样的问题。我正在使用 dotenv 并且在我使用它的文件之后我需要 dotenv,因此为我修复了它。可能没有帮助,但只是让您知道这就是为我做的!【参考方案3】:

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

您可以在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"

【讨论】:

【参考方案4】:

问题是因为我在.env 文件中使用了dotenv 变量,所以FIREBASE_PRIVATE_KEY 在其中包含转义字符:\n

我必须关注 this answer 并将 .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
);

【讨论】:

我在 Firebase 中创建新密钥后遇到了这个问题。我将键值保留在 Firebase 环境变量中,因此我不必针对 \n 进行调整。当我firebase deploy --only functions 时,我收到 PEM 错误。有什么建议吗? 我以前从未使用过 Firebase 环境变量。我希望我能帮忙 这解决了我的问题。奇怪的是它没有它就可以工作,然后突然停止工作。无论如何,投票给其他人看。 @PatrickMichaelsen 同样的事情也发生在我身上。在我更改为新的私钥并再次尝试它不再起作用之后,它在没有它的情况下工作了一些奇怪的东西。很奇怪。无论如何,很高兴我能提供帮助并感谢您的支持。干杯! 我在 AWS 弹性 beantalk 上遇到了同样的情况,我在环境变量中添加了 \\n 而不是 \n,并在我访问它们的位置添加了替换。

以上是关于Node.js -Firebase 服务帐户私钥不会解析的主要内容,如果未能解决你的问题,请参考以下文章

gpg: no default secret key: 私钥不可用

使用openssl生成的私钥不是以 BEGIN RSA PRIVATE KEY 开头,而是以BEGIN PRIVATE KEY开头

windows server+express+node.js配置https

服务帐户是在 node.js 中查询 google bigquery 的正确凭据吗?

通过 OAuth 2.0 和私钥(即服务帐户)访问 Google Contacts Api

设置Linux服务器通过密钥登录