如何在Firebase托管上设置私有环境变量?

时间:2015-12-23 19:50:11

标签: firebase firebase-hosting

随着Divshot最近关闭,我已将许多应用程序切换到Firebase托管。其中一些应用程序连接到外部API,因此我需要一种方法来存储Firebase托管上的私有环境变量(例如,S3访问的密钥) - 任何人都有任何想法?有这篇文章 - https://www.firebase.com/blog/2015-10-29-managing-development-environments.html - 但这只适用于非私有环境变量。

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以使用Firebase Cloud Functions设置环境变量。这是有关如何执行此操作的文档的链接:https://firebase.google.com/docs/functions/config-env

如果您没有在Firebase托管中添加云功能,则可以通过Firebase cli工具这样做:

firebase init functions
npm install --save firebase-functions@latest
npm install -g firebase-tools

有关此内容的更多信息:https://firebase.google.com/docs/hosting/functions

要在云功能中设置环境变量,您可以从命令行进行设置,如下所示:

firebase functions:config:set someservice.key="THE API KEY" someservice.id="THE CLIENT ID"

然后您可以通过如下函数访问变量:

const functions = require('firebase-functions');
const request = require('request-promise');

exports.userCreated = functions.database.ref('/users/{id}').onWrite(event => {
  let email = event.data.child('email').val();

  return request({
    url: 'https://someservice.com/api/some/call',
    headers: {
      'X-Client-ID': functions.config().someservice.id,
      'Authorization': `Bearer ${functions.config().someservice.key}`
    },
    body: {email: email}
  });
});

答案 1 :(得分:1)

您可以尝试使用Google的Secret Manager API

与将其存储为Firebase Cloud Functions中的环境变量相比,其安全性更安全的原因是:

  1. Secret Manager API强制执行最小特权原则。这意味着您可以限制对机密的访问,因此仅允许授权用户查看/编辑机密。
  2. 机密使用AES-256加密。
  3. 有一个审核日志记录功能,可用于异常检测。

有关源代码的更多示例,您可以查看Google Cloud的Secret Manager NPM软件包文档here

希望有帮助!

答案 2 :(得分:0)

根据这篇文章,我有一个适合我的解决方案: https://victorbruce82.medium.com/how-to-deploy-a-react-app-to-different-firebase-hosting-environments-dev-and-prod-da3f4cae9a1e

它使用 env-cmd,并且您不需要云函数来在当前运行站点的 Firebase 托管上获取正确的环境变量(因为 NODE_ENV 总是返回 {{1} } 部署在 firebase 上时)

基于使用两个独立的 firebase 项目,一个用于生产,一个用于开发。所以在添加第二个 firebase 项目后,用于开发:

将开发项目添加到您当前的项目:production,并使用别名 firebase use --add

创建两个 dev 文件:.env.env.production,每个文件都有一个变量,例如:

.env.development

(在 .env.development 文件中将其更改为 APP_ENV="production"

(您还可以将 API 密钥添加到这些 .env 文件中,确保您development它们,这样您的代码库中就没有秘密)

现在在您的代码中,您可以使用 .gitignore 引用它:

process.env.APP_ENV

(您也可以选择在 .env 文件中添加 const websiteConfig = process.env.APP_ENV=== 'production' ? { themeColor: '#fff' } : { themeColor: '#ccc' } 并直接访问它,具体取决于您的偏好)

安装APP_THEME_COLOR

env-cmd

现在向您的 npm i -D env-cmd 添加 2 个脚本:

package.json

现在您可以将代码部署到两个完全不同的环境中,但也可以让它们具有不同的环境变量。

(注意:在您的 .env 文件中使用 "build:dev":"env-cmd -f .env.development npm run build && firebase deploy -P dev", "build:prod":"env-cmd -f .env.production npm run build && firebase deploy -P prod" 不起作用,部署在 Firebase 托管上时它总是会返回 NODE_ENV