Divshot最近关闭了,我已经将一些应用程序切换到Firebase主机。这些应用程序中有一些连接到外部API,因此我需要一种在Firebase托管上存储私有环境变量的方法(例如S3访问的秘密密钥) - 有人有什么想法吗?这里有一篇文章 - https://www.firebase.com/blog/2015-10-29-managing-development-environments.html - 但那只适用于非私有环境变量。
谢谢!
Divshot最近关闭了,我已经将一些应用程序切换到Firebase主机。这些应用程序中有一些连接到外部API,因此我需要一种在Firebase托管上存储私有环境变量的方法(例如S3访问的秘密密钥) - 有人有什么想法吗?这里有一篇文章 - https://www.firebase.com/blog/2015-10-29-managing-development-environments.html - 但那只适用于非私有环境变量。
谢谢!
Firebase Hosting无法存储私有环境变量。它仅用于静态托管。如果您想使用私有变量,您需要在服务器端执行。
如果您想以“Firebase方式”处理秘密,您可以使用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}
});
});
firebase-functions
安全吗? - Francis Rodrigues如果您想使用GitHub Actions进行Firebase部署,可以在构建和部署之前创建.env
变量。
只需在GitHub存储库设置中将环境变量设置为秘密,并在.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
即可使用该变量!
我有一个对我有效的解决方案,基于这篇文章: https://victorbruce82.medium.com/how-to-deploy-a-react-app-to-different-firebase-hosting-environments-dev-and-prod-da3f4cae9a1e
它使用env-cmd
,并且你不需要云函数来获取当前 Firebase 托管站点上的正确环境变量(因为在 Firebase 上部署时,NODE_ENV
总是返回production
)
基于使用两个单独的 Firebase 项目,一个用于生产环境,一个用于开发环境。所以在添加用于开发的第二个 Firebase 项目之后:
使用firebase use --add
将 dev 项目添加到当前项目中,并使用别名dev
。
创建两个 .env
文件:.env.production
和.env.development
,每个文件中都包含一个变量。
APP_ENV="production"
development
).gitignore
来忽略它们,以免在代码库中暴露机密信息)process.env.APP_ENV
引用它)const websiteConfig = process.env.APP_ENV=== 'production' ? {
themeColor: '#fff'
} : {
themeColor: '#ccc'
}
(根据您的喜好,您还可以选择在.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"
现在您可以将代码部署到两个不同的环境/域名/主机上,同时还可以使用不同的环境变量。
(注意:在您的 .env 文件中使用 NODE_ENV
是无效的,在 firebase hosting 上部署时它总是返回 production
)
env-cmd
。Firebase会自动读取 .env.<alias>
文件,所以你可以将你的配置文件命名为 .env.dev
和 .env.prod
,然后就可以开始使用了。更多信息 - thdoanbuild
е‘Ҫд»ӨеңЁиҝҗиЎҢж—¶дёҚзҹҘйҒ“иҰҒдҪҝз”Ёе“ӘдёӘзҺҜеўғж–Ү件пјҢжҲ–иҖ…е®ғжҳҜеҗҰд»ҺдҪ иҰҒиҝҗиЎҢзҡ„build:x
е‘Ҫд»ӨдёӯиҜ»еҸ–пјҹ - TrySpacefirebase use dev
,那么部署的函数将自动从 .env.dev
中读取环境变量。这在我提供的链接页面中有进一步的文档说明。 - thdoanenv-cmd
来将正确的环境传递给构建命令。 - TrySpace"build": "rollup -c", "build-dev": "rollup -c rollup-dev.config.js", "deploy": "firebase use prod && npm run build && firebase deploy", "deploy-dev": "firebase use dev && npm run build-dev && firebase deploy"
- thdoanfirebase functions:secrets:set YOUR_ENV_VARIABLE_NAME
将您的秘密复制并粘贴到控制台中。
然后在您的函数中,您可以通过以下方式访问它
exports["myfunc"] = runWith({secrets: ["YOUR_ENV_VARIABLE_NAME"]}).https.onCall(() => {
process.env.YOUR_ENV_VARIABLE_NAME
})
如需更多信息,请查看Firebase官方文档
cloud function
edit
,然后可以添加env变量、构建变量。