使用 firebase privateKey 作为 Heroku 配置变量的转义问题

Posted

技术标签:

【中文标题】使用 firebase privateKey 作为 Heroku 配置变量的转义问题【英文标题】:Escaping issue with firebase privateKey as a Heroku config variable 【发布时间】:2017-01-22 09:16:42 【问题描述】:

我正在尝试创建一个 Heroku 节点任务,该任务从 Firebase 读取数据并对其进行控制台记录。

我的节点脚本(位于 /bin 目录内)是:

require('dotenv').config( silent: true );

var firebase = require('firebase');
firebase.initializeApp(
  serviceAccount: 
    projectId: process.env.fb_projectId,
    clientEmail: process.env.fb_clientEmail,
    privateKey: process.env.fb_privateKey
  ,
  databaseURL: process.env.fb_databaseURL
)

console.log(process.env.fb_privateKey);

firebase.database().ref('tasks').once('value', function(snapshot) 
  console.log(snapshot.val());
  process.exit();
)

所有环境变量都是正确的,除了fb_privateKey,因为它包含\n 字符。

我的本​​地 .env 文件和 Heroku 环境变量都包含一个名为 fb_privateKey 的键和一个带有 \n 字符的字符串形式的值 - 用 " 包围。

fb_privateKey="-----BEGIN PRIVATE KEY-----\nMY-PRIVATE-KEY\n-----END PRIVATE KEY-----\n"

当我在本地运行脚本时,它会记录带有新行的私钥 + 从 Firebase 返回的任务。但是,当我在 Heroku 上运行它时,(heroku run myScript) 会记录我带有 \n 字符的私钥(作为单行),并且无法从 Firebase 读取数据(可能是由于私钥错误)。有什么想法吗?

【问题讨论】:

您应该将 Erem 的答案标记为正确。 【参考方案1】:

我今天也遇到了同样的问题。您需要通过将\\n 字符替换为\n 来清理读取的私钥。

admin.initializeApp(
  credential: admin.credential.cert(
    "projectId": process.env.FIREBASE_PROJECT_ID,
    "private_key": process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n'),
    "clientEmail": process.env.FIREBASE_CLIENT_EMAIL,
  ),
  databaseURL: process.env.FIREBASE_DATABASE_URL,
);

【讨论】:

这个解决方案让我可以在 Vercel 中使用 Firebase 私钥。 在 Netlify 环境变量中使用私钥为我工作:) 在将 NextJs 应用程序部署到 AWS Amplify 时,此解决方案对我有用。 适用于自动编码【参考方案2】:

我通过在私钥上使用 .replace(/\n/g, '\n') 并从 heroku config vars 上的私钥值中删除引号来解决这个问题,如下所示。

-----BEGIN PRIVATE KEY-----\nMY-PRIVATE-KEY\n-----END PRIVATE KEY-----\n

【讨论】:

【参考方案3】:

在我的例子中,我通过将 FIREBASE_PRIVATE_KEY 转换为 base64 字符串来解决它,然后我将这个新字符串保存为 Heroku 中的环境变量。在我的代码中,我再次将 base64 FIREBASE_PRIVATE_KEY 转换为原始私钥。

const firebase_private_key_b64 = Buffer.from(process.env.FIREBASE_PRIVATE_KEY_BASE64, 'base64');
const firebase_private_key = firebase_private_key_b64.toString('utf8');

admin.initializeApp(
    credential: admin.credential.cert(
        "project_id": process.env.FIREBASE_PROJECT_ID,
        "private_key": firebase_private_key,
        "client_email": process.env.FIREBASE_CLIENT_EMAIL,
    ),
    databaseURL: process.env.FIREBASE_DATABASE_URL
);

【讨论】:

最佳解决方案,很好解释。与 Netlify 一起使用。

以上是关于使用 firebase privateKey 作为 Heroku 配置变量的转义问题的主要内容,如果未能解决你的问题,请参考以下文章

要转换为 PrivateKey 对象的字节

Azure Api 管理 ValidateJWT 与 Rs256 PrivateKey

我可以使用 Firebase 动态链接作为 URL 缩短器吗?

如何将 Byte 数组转换为 PrivateKey 或 PublicKey 类型?

从KeyStore传输PrivateKey,在OpenSSL中使用JNI

如何使用 Firebase 作为具有生成密钥(JS)的关系数据库?