Firebase 实时数据库规则不允许经过匿名身份验证的用户

问题描述 投票:0回答:1

我有一个简单的 Web 应用程序,带有 Firebase 实时数据库和 Firebase 身份验证。 我的数据库规则如下所示:

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

因此只有经过身份验证的用户才能读取/写入自己的用户记录。 但是,当我允许匿名身份验证时,匿名用户无法写入自己的个人资料记录,即使他们有 UID 并且正在写入正确的记录。我收到 Firebase“权限被拒绝”错误。

对于经过电子邮件+密码验证的用户来说,这一切都可以正常工作。需要明确的是,使用电子邮件+密码提供商登录可以正常工作,但匿名登录(使用匿名提供商)不允许写入访问权限。

我正在

onAuthStateChanged()
回调中测试这一点,所以我知道用户是有效的:

onAuthStateChanged(auth, async (user) => {
  try {
    // ignore token refresh events
    if (user && currentUID === user.uid)
      return

    if (user) {
      currentUID = user.uid
      // Create user record and update last login
      const db = getDatabase()
      const userRef = ref(db, 'users/' + user.uid)
      console.log(JSON.stringify(user))
      if (true) { // <<<<<<<<<<< THIS IS WHERE I GET "permission denied"
        update(userRef, {
          email: user.email || '-none-',
          uid: user.uid,
          lastLogin: serverTimestamp()
        })
          .catch(err => handleError(err))
      }
      on_sign_in(user)
    } else {
      currentUID = null
      // User is signed out
      on_sign_out()
    }

  } catch (error) {
    handleError(error, error.message)
  }
})
javascript firebase-realtime-database firebase-authentication firebase-security
1个回答
0
投票

我尝试重现该问题,但 SDK 和代码似乎按我的预期工作。我在这里发布了我的最小非重现,希望它能帮助您找到非工作代码和我的工作示例之间的区别。

我的代码:

onAuthStateChanged(auth, (user) => {
  if (user) {
    console.log("User signed in", user);

    const dbRef = ref(db, "77153837");
    const userRef = child(dbRef, user.uid);

    set(userRef, false).then(() => {
      console.log("Wrote to db");
    });
  }
})
signInAnonymously(auth);

我使用的规则:

{
  "rules": {
    "77153837": { 
      "$uid": { 
        ".write": "$uid === auth.uid" 
      } 
    }
  }
}

其中

77153837
是您在此处发布的问题的 ID。除此之外,它对问题没有任何意义。

您可以在此处查看完整代码并运行它:https://stackblitz.com/edit/firebase-v9-rtdb-anonymous-writes

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.