链接帐户时的Firebase数据库规则

时间:2017-03-20 14:44:23

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

我有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'是错误的,但我正在分享以帮助您进行诊断。

BTW:如果规则是

,一切都很好
 {
    "rules": {
      "currentSession": {
        "$uid": {
           ".write": true,
            ".read": true
          }
        ...
 },

但我对这么弱的规则感到不满

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

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

1 个答案:

答案 0 :(得分:2)

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

auth.provider == 'anonymous'

examples here可以看出,double =比较而不是单一(赋值)。

然而,我还不完全确定你是否需要匿名位。

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