在这里基于prufrofro和Frank van Puffelen的答案的基础上,我整理了此设置,该设置不会阻止抓取,但会使使用API密钥的难度稍大一些。
警告:即使使用这种方法也要获取数据,例如,可以简单地在Chrome中打开JS控制台并输入:
firebase.database().ref("/get/all/the/data").once("value", function (data) {
console.log(data.val());
});
只有数据库安全规则才能保护您的数据。
不过,我将生产API密钥的使用限制为我的域名,如下所示:
- https://console.developers.google.com/apis
- 选择您的Firebase项目
- 证书
- 在“ API密钥”下,选择“浏览器”密钥。它看起来应该像这样:“ 浏览器密钥(由Google Service自动创建) ”
- 在“ 接受来自这些HTTP参照请求(网站) ”中,增加您的应用程序的URL(为例:
projectname.firebaseapp.com/*
)
现在,该应用将仅适用于该特定域名。因此,我创建了另一个API密钥,该密钥对于本地主机开发是私有的。
- 点击创建凭据> API密钥
默认情况下,如Emmanuel Campos所述,Firebase仅将白名单localhost
和Firebase托管域列入白名单。
为了确保我不会错误地发布错误的API密钥,我使用以下方法之一自动在生产中使用受限制的方法。
建立反应应用程式的设定
在/env.development
:
REACT_APP_API_KEY=###dev-key###
在/env.production
:
REACT_APP_API_KEY=###public-key###
在 /src/index.js
const firebaseConfig = {
apiKey: process.env.REACT_APP_API_KEY,
// ...
};
我之前对Webpack的设置:
我使用Webpack来构建生产应用程序,并且像平常一样将我的dev API密钥放入我的产品中index.html
。然后,在我的webpack.production.config.js
文件中,每次index.html
复制到生产版本时,我都会替换密钥:
plugins: [
new CopyWebpackPlugin([
{
transform: function(content, path) {
return content.toString().replace("###dev-key###", "###public-key###");
},
from: './index.html'
}
])
]