Javascript 向公众公开Firebase apiKey安全吗?

Javascript 向公众公开Firebase apiKey安全吗?,javascript,firebase,Javascript,Firebase,我应该将给定的apiKey放入Html中以初始化Firebase的状态: //TODO:替换为项目的自定义代码段 //初始化Firebase 变量配置={ apiKey:“”, 身份验证域:“”, 数据库URL:“”, storageBucket:“” }; firebase.initializeApp(配置); 通过这样做,apiKey将向每个访问者公开 该密钥的用途是什么?它是否真的是公开的?此配置片段中的apiKey仅用于识别您在Google服务器上的Firebase项目。这不是一个安全

我应该将给定的
apiKey
放入Html中以初始化Firebase的状态:

//TODO:替换为项目的自定义代码段
//初始化Firebase
变量配置={
apiKey:“”,
身份验证域:“”,
数据库URL:“”,
storageBucket:“”
};
firebase.initializeApp(配置);
通过这样做,
apiKey
将向每个访问者公开


该密钥的用途是什么?它是否真的是公开的

此配置片段中的apiKey仅用于识别您在Google服务器上的Firebase项目。这不是一个安全风险的人知道它。事实上,他们有必要了解这一点,以便与您的Firebase项目进行交互。同样的配置数据也包含在每个使用Firebase作为后端的iOS和Android应用程序中

从这个意义上讲,它与数据库URL非常相似,后者在同一个代码段中标识与项目关联的后端数据库:
https://,包括使用Firebase的服务器端安全规则,以确保只有授权用户才能访问后端服务

如果您想了解如何确保对Firebase后端服务的所有数据访问获得授权,请阅读上的文档。这些规则控制对文件存储和数据库的访问,并在Firebase服务器上强制执行。因此,无论是您的代码,还是其他人的代码使用您的配置数据,它都只能执行安全规则允许它执行的操作

有关Firebase将这些值用于什么以及可以为其中哪些设置配额的另一种解释,请参阅上的Firebase文档


如果您想减少将此配置数据提交到版本控制的风险,请考虑使用。虽然这些键仍将以相同的格式出现在浏览器中,但它们将不再硬编码到您的代码中


更新(2021年5月):多亏了名为的新功能,现在实际上可以将Firebase项目中后端服务的访问限制为仅来自特定项目中注册的iOS、Android和Web应用程序的访问

您通常希望将其与上面描述的基于用户身份验证的安全性结合起来,这样您就可以对使用您的应用程序的滥用用户提供另一个防护


通过将应用程序检查与安全规则相结合,您既可以广泛防止滥用,又可以控制每个用户可以访问的数据,同时仍然允许从客户端应用程序代码直接访问数据库。

此配置代码段中的apiKey仅用于标识Google服务器上的Firebase项目。这不是一个安全风险的人知道它。事实上,他们有必要了解这一点,以便与您的Firebase项目进行交互。同样的配置数据也包含在每个使用Firebase作为后端的iOS和Android应用程序中

从这个意义上讲,它与数据库URL非常相似,后者在同一个代码段中标识与项目关联的后端数据库:
https://,包括使用Firebase的服务器端安全规则,以确保只有授权用户才能访问后端服务

如果您想了解如何确保对Firebase后端服务的所有数据访问获得授权,请阅读上的文档。这些规则控制对文件存储和数据库的访问,并在Firebase服务器上强制执行。因此,无论是您的代码,还是其他人的代码使用您的配置数据,它都只能执行安全规则允许它执行的操作

有关Firebase将这些值用于什么以及可以为其中哪些设置配额的另一种解释,请参阅上的Firebase文档


如果您想减少将此配置数据提交到版本控制的风险,请考虑使用。虽然这些键仍将以相同的格式出现在浏览器中,但它们将不再硬编码到您的代码中


更新(2021年5月):多亏了名为的新功能,现在实际上可以将Firebase项目中后端服务的访问限制为仅来自特定项目中注册的iOS、Android和Web应用程序的访问

您通常希望将其与上面描述的基于用户身份验证的安全性结合起来,这样您就可以对使用您的应用程序的滥用用户提供另一个防护


通过将应用程序检查与安全规则相结合,您既可以广泛防止滥用,又可以控制每个用户可以访问哪些数据,同时仍然允许从客户端应用程序代码直接访问数据库。

以prufrofro和Frank van Puffelen的答案为基础,我把这个设置放在一起,它不会阻止刮取,但会使API密钥的使用稍微困难一些

警告:要获取数据,即使使用此方法,您也可以在Chrome中打开JS控制台并键入:

firebase.database().ref("/get/all/the/data").once("value", function (data) {
    console.log(data.val());
});
只有数据库安全规则才能保护您的数据。

尽管如此,我还是将生产API密钥的使用限制为我的域名,如下所示:

".read": "auth != null && root.child('/userdata/'+auth.uid+'/userRole').exists()",
".write": "auth != null && root.child('/userdata/'+auth.uid+'/userRole').exists()"
"userdata": {
  "$userId": {
    ".write": "$userId === auth.uid || root.child('/userdata/'+auth.uid+'/userRole').val() === 'superadmin'",
   ...
  • 选择您的Firebase项目
  • 证书
  • 在API键下,选择浏览器键。它应该是这样的:“浏览器键(由谷歌服务自动创建)”
  • 在“接受这些用户的请求”中 HTTP referers(web站点)”,添加应用程序的URL(例如:
    projectname.firebaseapp.com/*
  • 现在,该应用程序将只在这个特定的域名上工作。因此,我创建了另一个API密钥,该密钥对于本地主机开发是私有的

  • 单击创建凭据>API密钥
  • 默认情况下,如Emmanuel Campos所述


    为了确保我不会发表
    const firebaseConfig = {
      apiKey: process.env.REACT_APP_API_KEY,
      // ... 
    };
    
    exports.addUser = functions.auth.user().onCreate(onAddUser);
    exports.deleteUser = functions.auth.user().onDelete(onDeleteUser);
    
      "rules": {
        "users": {
          "$uid": {
            ".read": "auth != null && auth.uid == $uid",
            ".write": "auth != null && auth.uid == $uid"
          }
        }
      }
    }
    
    ".read": "auth != null && root.child('/userdata/'+auth.uid+'/userRole').exists()",
    ".write": "auth != null && root.child('/userdata/'+auth.uid+'/userRole').exists()"
    
    "userdata": {
      "$userId": {
        ".write": "$userId === auth.uid || root.child('/userdata/'+auth.uid+'/userRole').val() === 'superadmin'",
       ...