如何在Firebase主机上设置私有环境变量?

kyvafyod  于 2023-03-19  发布在  其他
关注(0)|答案(7)|浏览(157)

Divshot最近关闭了,我已经把一些应用程序切换到了Firebase托管。其中一些应用程序连接到外部API,所以我需要一种方法来在Firebase托管上存储私有环境变量(例如,用于S3访问的密钥)-有人有什么想法吗?有这篇文章-https://www.firebase.com/blog/2015-10-29-managing-development-environments.html-但这只针对非私有环境变量。
谢谢!

5hcedyr0

5hcedyr01#

Firebase主机不能存储私有环境变量。它只用于静态主机。如果你想使用私有变量,你需要在服务器端使用。
如果你想要一个“Firebase方式”来处理机密,你可以使用Firebase云函数,并在云函数中设置一个环境变量。这里是如何操作的文档链接: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}
  });
});
c8ib6hqw

c8ib6hqw2#

你可以试试谷歌的Secret Manager API
这比将其作为环境变量存储在Firebase云函数中更安全的原因是:

  1. Secret Manager API强制执行最小权限原则。这意味着您可以限制对机密的访问,因此仅允许授权用户查看/编辑机密。
    1.使用AES-256对机密进行加密。
    1.有一个审计日志记录功能可用于异常检测。
    有关源代码的更多示例,您可以查看Google Cloud的Secret Manager NPM包文档here
    希望能有所帮助!
vawmfj5a

vawmfj5a3#

如果您希望使用GitHub操作部署到Firebase,可以考虑在构建和部署之前创建.env变量。
只需在GitHub存储库设置下将环境变量设置为secret,然后在.github/workflows/{action}.yml中添加以下步骤

...
- name: Create env file
    run: |
      touch .env
      echo API_ENDPOINT=${{ secrets.API_ENDPOINT }} >> .env
      echo API_KEY=${{ secrets.API_KEY }} >> .env
      cat .env
...

在代码库中,只需调用process.env.API_KEY即可使用该变量!

uqdfh47h

uqdfh47h4#

基于这篇文章,我有一个适合我的解决方案:https://victorbruce82.medium.com/how-to-deploy-a-react-app-to-different-firebase-hosting-environments-dev-and-prod-da3f4cae9a1e
它使用env-cmd,并且您不需要cloud-function来获取当前firebase上的正确env变量,firebase是运行站点的主机(因为当部署在firebase上时,NODE_ENV总是返回production
基于使用两个单独的firebase项目,一个用于生产,一个用于开发。因此,添加第二个firebase项目后,用于开发:
使用以下命令将开发项目添加到当前项目:firebase use --add,并使用别名dev
创建两个.env文件:.env.production.env.development,每个变量如下所示:

APP_ENV="production"

(在.env.开发文件中将其更改为development
(You我也可以向这些.env文件添加API密钥,确保您.gitignore它们,这样您的代码库中就没有秘密了)
现在,在代码中,您可以使用process.env.APP_ENV引用此函数:

const websiteConfig = process.env.APP_ENV=== 'production' ? {
  themeColor: '#fff'
} : {
  themeColor: '#ccc'
}

(You也可以选择在.env文件中包含APP_THEME_COLOR,并根据您的偏好直接访问它)
安装env-cmd
npm i -D env-cmd
现在向您的package.json添加2个脚本:

"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"

现在,您可以将代码部署到两个完全不同的环境中,但也可以让它们具有不同的环境变量。
(Note:在.env文件中使用NODE_ENV不起作用,当部署在firebase主机上时,它将始终返回production

dzjeubhm

dzjeubhm5#

要将.env或环境值添加到firebase托管,请执行以下步骤:
1.转到Google云帐户https://cloud.google.com/
1.选择与您在firebease中托管的项目相同的项目。
1.转到服务cloud function
1.找到您的服务,然后单击edit,您可以添加env变量和build变量。
1.(可选)您可以看到生成文件,可以添加/编辑.env文件

eyh26e7m

eyh26e7m6#

为了使React能够通过process.env访问这些环境变量,请以REACT_APP_作为环境变量名的开头

6mw9ycah

6mw9ycah7#

从2023年起,对于大多数API访问密钥,您应该使用secrets而不是config

firebase functions:secrets:set YOUR_ENV_VARIABLE_NAME

复制粘贴您的秘密到控制台。
然后在函数中,可以使用以下命令访问它

exports["myfunc"] = runWith({secrets: ["YOUR_ENV_VARIABLE_NAME"]}).https.onCall(() => {
  process.env.YOUR_ENV_VARIABLE_NAME
})

有关详细信息,请参阅Firebase官方文档

相关问题