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

时间:2018-05-11 19:52:15

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

我在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
});

如何解决此问题?

3 个答案:

答案 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中生成的)。