【问题标题】:Firebase Database rules when linking accounts关联帐户时的 Firebase 数据库规则
【发布时间】:2017-05-04 17:17:44
【问题描述】:

我有一个使用匿名登录或登录帐户存储数据的 Android 应用程序。

问题是当用户想要将作为匿名用户创建的数据转换为登录帐户时。我成功链接了匿名和登录帐户,但我得到了

SyncTree: Listen at /currentSession/xxx-AnonymousLoginUserId-xx failed: DatabaseError: This client does not have permission to perform this operation

我怀疑这是因为访问规则,但我不知道如何指定它们来告诉 Firebase 它应该接受这两个帐户。

规则看起来像

{
  "rules": {
    "currentSession": {
      "$uid": {
        ".write": "$uid === auth.uid || auth.provider === 'anonymous'",
        ".read": "$uid === auth.uid || auth.provider === 'anonymous'"
      }
    ...
},

现在,当我考虑这个问题时,我确信 || auth.provider='anonymous' 是错误的,但我正在分享以帮助您进行诊断。

顺便说一句:如果规则是,一切都很好

 {
    "rules": {
      "currentSession": {
        "$uid": {
           ".write": true,
            ".read": true
          }
        ...
 },

但我对这么弱的规则不满意

编辑 1:auth.provider='anonymous' 的语法错误可能不是原因(我没有复制它,我只是从记忆中输入的)。

编辑 2:请注意 currentSession : { "$uid" : { ...我意识到问题很可能是 auth.uid 只是一个变量,但如果是链接帐户,它可能应该是一组 uid。有什么想法吗?

【问题讨论】:

  • 关于您的编辑,您可能需要提供更多详细信息,说明您如何准确地关联帐户以及在这种特殊情况下您正在执行的操作的一些代码。

标签: android firebase-realtime-database firebase-security


【解决方案1】:

我认为这里的语法错误是您的规则的 anonymous 部分应该是:

auth.provider == 'anonymous'

正如examples here 中所见,一个双 = 来比较而不是一个单一的(赋值)。

但除此之外,我不完全确定您是否需要匿名位。

如果流程是某人以匿名用户身份开始,然后将其转换为新的登录帐户,而不是使用 linkWithCredential 功能,则 Uid 始终保持不变。在这种情况下,只需检查 uid 是否匹配就足够了,因为该帐户当前是否匿名并不重要。

【讨论】:

  • 好的,我会仔细检查。谢谢。
  • 更新了我原来的问题,问题可能出在数据结构上,事实上auth.uid 只有一个值,但我希望它包含两个 uid,以防我链接匿名并登录帐户。
  • 如果您开始匿名并稍后切换到已分配 uid 的现有帐户,则 Uid 不能相同。
猜你喜欢
  • 2021-02-06
  • 2021-04-17
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多