【问题标题】:Node.js -Firebase Service Account Private Key won't parseNode.js -Firebase 服务帐户私钥不会解析
【发布时间】: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
});

我该如何解决这个问题?

【问题讨论】:

    标签: json node.js parsing npm firebase-authentication


    【解决方案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,并在我访问它们的位置添加了替换。
        猜你喜欢
        • 2021-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-13
        • 1970-01-01
        • 1970-01-01
        • 2017-08-26
        • 1970-01-01
        相关资源
        最近更新 更多