【问题标题】:Escaping issue with firebase privateKey as a Heroku config variable使用 firebase privateKey 作为 Heroku 配置变量的转义问题
【发布时间】: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 的答案标记为正确。

标签: javascript heroku firebase firebase-realtime-database


【解决方案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 一起使用。
    猜你喜欢
    • 1970-01-01
    • 2021-05-06
    • 2020-06-03
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 2017-05-19
    相关资源
    最近更新 更多