6

背景:在我的 iOS 游戏中,我希望允许用户无需登录即可玩游戏(在 Firebase 中进行匿名身份验证以保存用户数据),但也让他们可以选择使用 Facebook 登录以解锁其他游戏玩法。

我正在尝试修改这篇文章,用匿名登录替换 Twitter 登录:

"users": {
    "$userid": {
      // Require the user to be logged in, and make sure their current credentials
      // match at least one of the credentials listed below, unless we're creating
      // a new account from scratch.
      ".write": "auth != null && 
        (data.val() === null || 
        (auth.provider === 'facebook' && auth.uid === data.child('facebook/id').val() || 
        (auth.provider === 'anonymous' && auth.uid === data.child('anonymous/id').val()))"
    }
  }

我很困惑过渡将如何使用这些规则。特别是说:

  1. 用户以匿名方式进行身份验证,并且能够使用存储在users/"$userid"/anonymous/id. 这是允许的,因为用户已通过身份验证并且是第一次设置用户对象 ( auth != null && data.val() === null)。

  2. 允许任何后续写入,users/"$userid"/因为经过身份验证的用户的匿名 ID 存储在用户树 ( auth != null && (auth.provider === 'anonymous' && auth.uid === data.child('anonymous/id').val())) 中。

  3. 用户登录 facebook。现在authData包含尚未写入的 facebook uid users/"$userid"/facebook/id。写入该位置失败,因为安全规则不允许。

因此,匿名用户在 facebook 身份验证完成之前无法访问 facebook uid。到那时,写信为时已晚,users/"$userid"/facebook/id因为经过身份验证的用户现在是 facebook 用户,并且无权在那里写信。

我错过了什么吗?关于如何纠正这种情况的任何想法?

4

0 回答 0