没有身份验证的用户名测试数据库[Firebase / Swift 3]

时间:2017-07-12 12:12:01

标签: ios swift firebase firebase-realtime-database firebase-authentication

我目前的问题是,当用户想要在我的应用上创建帐户时(使用Firebase),会出现以下错误:

  

2017-07-12 21:57:05.958 GeneralMessage [8525] [Firebase /数据库] [I-RDB038012] / users的监听器失败:permission_denied

我意识到发生错误是因为用户尝试从数据库中读取而未登录到帐户(已通过身份验证)。问题还在于,如果用户在进行测试时(在他们创建帐户之前),用户将永远不会在测试时进行身份验证。

我知道您可以编辑实时数据库规则以允许未经身份验证的用户访问数据库,但我也读到这是一个安全隐患,只能在测试期间使用。

我的想法是在用户点击“创建帐户”时临时验证用户身份。按钮,但我也不确定如何做到这一点。

感谢您的帮助:)

1 个答案:

答案 0 :(得分:2)

如果您希望未经身份验证的用户能够阅读部分数据库,则需要修改安全规则以允许这样做。对于特定的应用程序实例,暂时无法执行此操作,因为这将需要识别每个应用程序实例 - 就像用户一样。

我知道两种方法:

  1. 首先使用匿名身份验证为用户签名
  2. 将用户名存储在树的未受保护部分
  3. 首先使用匿名身份验证为用户签名

    或者,您最初可以使用匿名身份验证对用户进行签名:

    Auth.auth().signInAnonymously() { (user, error) in
      // ...
    }
    

    这只能部分保护数据访问:由于用户不能证明自己的身份,因此任何人都可以相对轻松地访问数据。这就是为什么我建议限制他们可以访问的数据......

    将用户名存储在树的未受保护部分

    这种方法很常见:您希望用户名可公开读取,因此您将其存储在数据库的单独部分中。

    usernames
      "T. Dess": 8295647
      "Frank van Puffelen": 209103
    

    然后使用您的安全规则:

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

    所以遵守这些规则:

    • 任何人都可以阅读用户名
    • 任何经过身份验证的用户都可以阅读用户个人资料
    • 每位已登录的用户只能修改自己的用户个人资料