使用服务帐户将Firebase应用程序部署到Heroku(使用dotenv的环境变量)

Luk*_*gen 27 heroku environment-variables node.js firebase firebase-authentication

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

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

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

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

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

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"
});
Run Code Online (Sandbox Code Playgroud)

这是将带有服务帐户的firebase应用程序部署到Heroku的最佳实践吗?我正在使用dotenv节点模块来完成此任务.

Rob*_*ell 32

cert选项对象有两个必填字段:clientEmailprivateKey.您的示例可以缩减为:

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

顺便说一句,某些环境可能在private_keyenv var中遇到新行问题; 我发现key.replace(/\\n/g, '\n')这是一个简单的解决方案.

  • 你也可以base64加密你的json对象,然后`JSON.parse(new Buffer(process.env.FIREBASE_SERVICE_ACCOUNT_BASE64, 'base64'))` (9认同)
  • 从来没听说过; 对我来说,只需减少要管理的变量数量就足够了。 (2认同)
  • 我今天尝试过-如果我不缺少任何东西,`project_id`似乎是强制性的。 (2认同)

小智 14

  1. 将 firebase 配置 JSON ( serviceAccountKey )转换为 base64 编码的字符串,这可以通过多种方式完成,例如使用 openssl 命令openssl base64 -in <firebaseConfig.json> -out <firebaseConfigBase64.txt>或使用 Nodejs,如下所示
Buffer.from(JSON.stringify({
  "type": "",
  "project_id": "",
  "private_key_id": "",
  "private_key": "",
  "client_email": "",
  "client_id": "",
  "auth_uri": "",
  "token_uri": "",
  "auth_provider_x509_cert_url": "",
  "client_x509_cert_url": ""
})).toString('base64')
Run Code Online (Sandbox Code Playgroud)
  1. 将上述步骤的输出 base64 编码字符串保存在一个 env 变量中,如GOOGLE_CONFIG_BASE64. (在 Heroku 的情况下将其保存到ConfigVars
  2. 在您的节点应用程序中初始化 firebaseSdk
const firebaseAdminSdk = require('firebase-admin'),
    firebaseAdminApp = firebaseAdminSdk.initializeApp({credential: firebaseAdminSdk.credential.cert(
      JSON.parse(Buffer.from(process.env.GOOGLE_CONFIG_BASE64, 'base64').toString('ascii')))
});
Run Code Online (Sandbox Code Playgroud)

  • 使用 openssl 时,我建议在命令中添加“-A”以删除换行符。`openssl base64 -in &lt;firebaseConfig.json&gt; -out &lt;firebaseConfigBase64.txt&gt; -A` (2认同)

小智 6

这是与我个人在将应用程序部署到使用 firebase 服务帐户的 heroku 时更喜欢使用的最佳答案略有不同的方法。

  • 按以下格式初始化您的 Firebase 应用程序:
const admin = require("firebase-admin");
require("dotenv").config();

const serviceAccount = JSON.parse(process.env.GOOGLE_CREDS);
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});
Run Code Online (Sandbox Code Playgroud)
  • 将服务帐户密钥文件中的内容复制为 JSON 并设置 GOOGLE_CREDS 以在 .env 中采用该值。确保默认删除 JSON 中的所有换行符,因为 .env 会将其读取为字符串。下面是它的外观示例:
GOOGLE_CREDS={"type": "service_account","project_id": "your-project-id","private_key_id": "your-private-key-id", ...}
Run Code Online (Sandbox Code Playgroud)
  • 以相同的格式复制相同的键值并将其粘贴到您的 heroku 配置变量中。

希望这有帮助,谢谢。