代码之家  ›  专栏  ›  技术社区  ›  Roman

Firebase web身份验证-如何知道用户是否是在我自己的域中创建的?[副本]

  •  0
  • Roman  · 技术社区  · 4 年前

    这个 Firebase Web-App guide apiKey 在我的Html中初始化Firebase:

    // TODO: Replace with your project's customized code snippet
    <script src="https://www.gstatic.com/firebasejs/3.0.2/firebase.js"></script>
    <script>
      // Initialize Firebase
      var config = {
        apiKey: '<your-api-key>',
        authDomain: '<your-auth-domain>',
        databaseURL: '<your-database-url>',
        storageBucket: '<your-storage-bucket>'
      };
      firebase.initializeApp(config);
    </script>
    

    阿皮基

    0 回复  |  直到 4 年前
        1
  •  525
  •   Frank van Puffelen    4 年前

    这个配置片段中的apiKey只是标识了您在Google服务器上的Firebase项目。如果有人知道这件事,就不会有安全风险。事实上,为了让他们与您的Firebase项目交互,他们有必要知道这一点。同样的配置数据也包含在每个使用Firebase作为后端的iOS和Android应用程序中。

    从这个意义上说,它非常类似于在同一个代码段中标识与项目关联的后端数据库的数据库URL: https://<app-id>.firebaseio.com . 请参见有关为什么这不是安全风险的问题: How to restrict Firebase data modification? ,包括使用Firebase的服务器端安全规则来确保只有授权用户才能访问后端服务。

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

    对于Firebase使用这些值的另一种解释,以及您使用这些值的原因 设置配额,请参阅上的Firebase文档 using and managing API keys .


    如果希望降低将此配置数据提交到版本控制的风险,请考虑使用 SDK auto-configuration of Firebase Hosting . 虽然这些键仍然以相同的格式出现在浏览器中,但它们不会再硬编码到您的代码中。

        2
  •  86
  •   now    4 年前

    here ,我将这个设置放在一起,它不会阻止刮取,但会使使用API密钥变得稍微困难一些。

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

    firebase.database().ref("/get/all/the/data").once("value", function (data) {
        console.log(data.val());
    });
    

    只有数据库安全规则才能保护您的数据。

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

    1. https://console.developers.google.com/apis
    2. 选择Firebase项目
    3. 资格证书
    4. 在API键下,选择浏览器键。应该是这样的:“ 浏览器键(由谷歌服务自动创建) "
    5. “在” HTTP引用程序(网站) ,添加应用程序的URL(例如: projectname.firebaseapp.com/* )

    现在这个应用程序只能在这个特定的域名上运行。所以我创建了另一个API密钥,它将是localhost开发的私有密钥。

    1. 单击“创建凭据”>“API密钥”

    默认情况下,正如Emmanuel Campos所说, Firebase only whitelists localhost and your Firebase hosting domain


    为了确保不会错误地发布错误的API键,我使用以下方法之一在生产环境中自动使用限制更大的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,
      // ... 
    };
    
        3
  •  28
  •   Teoman shipahi    7 年前

    我不相信向客户端公开安全/配置密钥。我不会说它是安全的,不是因为有人可以从第一天就窃取所有的私人信息,因为有人可以提出过多的要求,耗尽你的配额,让你欠谷歌一大笔钱。

    我更喜欢客户端首先会击中你的web服务器,在那里你把什么第一手防火墙,验证码,cloudflare,自定义安全之间的客户端和服务器,或服务器和firebase和你很好去。至少你可以在可疑活动到达火场之前先阻止它。你会有更多的灵活性。

    对于使用基于客户端的配置进行内部使用,我只看到一个好的使用场景。例如,您有一个内部域,并且您非常确定外部用户无法访问该域,因此您可以设置类似browser->firebase type的环境。

        4
  •  6
  •   Bhupiister singh    4 年前

    我相信,一旦数据库规则编写准确,就足以保护您的数据。此外,可以遵循一些准则来相应地构建数据库。例如,将UID节点置于users之下,并将所有信息置于其之下。之后,您将需要实现一个简单的数据库规则,如下所示

      "rules": {
        "users": {
          "$uid": {
            ".read": "auth != null && auth.uid == $uid",
            ".write": "auth != null && auth.uid == $uid"
          }
        }
      }
    }
    

    你可以在网上了解更多 Firebase Security rules

        5
  •  5
  •   bzk    5 年前

    我已经向谷歌报告了这件事,但他们说这是按计划进行的。

    如果无法禁用用户/密码帐户,则应执行以下操作: 创建一个云函数来自动禁用新用户onCreate并创建一个新的DB条目来管理他们的访问。

    例如:MyUsers/{userId}/Access:0

    exports.addUser = functions.auth.user().onCreate(onAddUser);
    exports.deleteUser = functions.auth.user().onDelete(onDeleteUser);
    

    更新规则以仅允许访问权限大于1的用户读取。

    如果侦听器函数没有足够快地禁用帐户,那么读取规则将阻止它们读取任何数据。

        6
  •  3
  •   Berci    4 年前

    读了这篇文章之后,在对可能性进行了一些研究之后,我想出了一种稍微不同的方法来限制未经授权的用户使用数据:

    ".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'",
       ...
    
        7
  •  0
  •   JustRaman    4 年前

    暴露API密钥并不存在安全风险,但任何人都可以将您的凭据放在他们的站点上。

    您可以始终将firebase项目密钥限制为域/IP。

    https://console.cloud.google.com/apis/credentials/key

    选择项目Id和密钥,并将其限制为Android/iOs/web应用程序。

        8
  •  -11
  •   Aman Srivastava    4 年前

    你不应该暴露这个信息。在公共场合,特别是api密钥。

    在公开网站之前,你应该把它藏起来。你可以用两种或两种以上的方法

    1. 复杂编码/隐藏
    2. 只需将firebase SDK代码放在网站或应用程序的底部,firebase就会自动完成所有工作。你不需要把API键放在任何地方