我有一个使用firebase服务帐户的 node 应用程序.我想将应用程序部署到Heroku,但我不想公开我的密钥.我直接从公共github repo进行部署,所以我不想在部署中包含服务帐户文件.

我可以使用服务帐户json文件,将每个属性设置为环境变量,将这些变量添加到Heroku并部署它.一切都很好(在我的firebase应用程序上授权了新的Heroku域之后),但是有更好的方法吗?这是可行的,但做起来有点痛苦(复制、粘贴每个变量并移动它).我错过了一个更简单的方法吗?

这是我正在做的改变.从这一行从文件中提取凭据:

admin.initializeApp({
  credential: admin.credential.cert('./path/firebase-service-account.json'),
  databaseURL: "https://my-firebase-app.firebaseio.com"
});

对于这个从环境变量中引入所有相同内容的对象:

admin.initializeApp({
  credential: admin.credential.cert({
    "type": process.env.FIREBASE_TYPE,
    "project_id": process.env.FIREBASE_PROJECT_ID,
    "private_key_id": process.env.FIREBASE_PRIVATE_KEY_ID,
    "private_key": process.env.FIREBASE_PRIVATE_KEY,
    "client_email": process.env.FIREBASE_CLIENT_EMAIL,
    "client_id": process.env.FIREBASE_CLIENT_ID,
    "auth_uri": process.env.FIREBASE_AUTH_URI,
    "token_uri": process.env.FIREBASE_TOKEN_URI,
    "auth_provider_x509_cert_url": process.env.FIREBASE_AUTH_PROVIDER_X509_CERT_URL,
    "client_x509_cert_url": process.env.FIREBASE_CLIENT_X509_CERT_URL
  }),
  databaseURL: "https://my-firebase-app.firebaseio.com"
});

这是将带有服务帐户的firebase应用程序部署到Heroku的最佳做法吗?我正在使用dotenv node 模块来实现这一点.

推荐答案

cert options对象有两个必填字段:clientEmailprivateKey(现在还有projectId).您的示例可以简化为:

admin.initializeApp({
  credential: admin.credential.cert({
    "projectId": process.env.FIREBASE_PROJECT_ID,
    "private_key": process.env.FIREBASE_PRIVATE_KEY,
    "client_email": process.env.FIREBASE_CLIENT_EMAIL,
  }),
  databaseURL: "https://my-firebase-app.firebaseio.com"
});

顺便说一句,有些环境可能会遇到private_key env var中的换行符问题;我发现key.replace(/\\n/g, '\n')是一个简单的解决方案.

Node.js相关问答推荐

如何使用jq将依赖项添加到package.json中

postgresql层与应用层的序列化

MongoDB上的updateOne和findOneAndUpdate在Node.js中无法正常工作

Express无法发布

创建查询以展开数组并筛选出具有特定值的元素之后的元素

如何发送比特币BTC使用发送加密使用WIF密钥在 node ,js

React原生Nodejs兼容性问题

将 null 推入管道后,node.js 可写完成未发出

AWS ECS 服务发现 Cors 问题?

为什么这个 module.export 函数如果我直接传递它就不起作用,但如果我将它包装在一个匿名函数中就可以工作

我如何在 Raku 的供应中注册不同的事件?

使用 fs.createWriteStream 将数据写入 bigquery (node.js) 时出现模式错误

为什么 $or 在带有正则表达式的mongoose 中不能正常工作

使用`useLocalStorage`和`useDebounce`时如何解决Next.js中的react-hydration-error

突然 React 无法执行create-react-app命令.为什么会发生这种情况,我该如何解决?

当我们有esnext时,为什么我们需要nodenext typescript 编译器选项?

如何在 node.js 环境中从 WebAssembly (Rust) 调用异步 JavaScript 导入函数?

如何为 node.js 服务器分配域名?

如何解决 Socket.io 404(未找到)错误?

#!/bin/env是什么意思(在 node.js 脚本的顶部)?