Firebase:权限被拒绝 - 而setValue()

时间:2015-08-31 11:59:28

标签: android firebase firebase-security

我正在尝试使用firebase构建聊天应用程序。

消息表的结构:

message -
   $message_id 
    - $message_push_id 
      - message {
        sender : 3, 
        receiver : 58,
        token : token_of_sender,
        message : hi 
        ....}
这里使用发件人和收件人ID生成

message_id “3_58”

我正在使用push将消息保存到firebase中。

{
    "rules": {
        ".read": true,
         "message":
        {
          "$messageid": {
            "$messagepushid":
            {
              ".read": true,
              ".write": "auth != null  && !data.exists()",
              ".indexOn": ["token", "userid", "receiverid", "sent_time"],
              ".validate": "auth.token == newData.child('token').val() && newData.hasChildren(['token', 'userid', 'receiverid', 'text'])"
            }
          }
        }
    }
}

我已经使用自定义令牌生成器生成令牌:

Firebase firebase = getFirebase();
Map<String, Object> authPayload = new HashMap<String, Object>();
authPayload.put("uid", user.getUserid());
authPayload.put("token", user.getToken());
TokenGenerator tokenGenerator = new TokenGenerator(Constants.FIREBASE_KEY);
TokenOptions tokenOptions = new TokenOptions();
tokenOptions.setAdmin(false);
final String firebaseToken = tokenGenerator.createToken(authPayload, tokenOptions);
firebase.authWithCustomToken(firebaseToken, new Firebase.AuthResultHandler() {
    @Override
    public void onAuthenticated(AuthData authData) {
        Log.d("Auth", "Success : " + authData.toString());
        Log.d("Auth", "Token : " + firebaseToken);
        SharedPrefs.setFirebaseUserToken(getActivity(), firebaseToken);
    }

    @Override
    public void onAuthenticationError(FirebaseError
    firebaseError) {
        firebaseError.toException().printStackTrace();
    }
});

我正在尝试推送新邮件,但我收到错误:

RepoOperation:setValue at / message / 3_58 / -Jy2We4cqLjuQNF6Oyhs failed:FirebaseError:Permission denied

我无法弄清楚我哪里出错了。

这是发送聊天的代码:

mConversationReferenceFireBase = mFireBase.child("message").child(mConversationId);
    Chat conversation = new Chat( mToken, mUserId, mReceiverId, message );
    mConversationReferenceFireBase.push().setValue(conversation, new Firebase.CompletionListener() {
        @Override
        public void onComplete(FirebaseError firebaseError, Firebase firebase) {
            if (firebaseError != null) {
                Log.e("Conversation", firebaseError.toString());
            }
        }
    });

mConversationId = 3_58

此处的令牌是为用户生成的。我们有一个单独的服务器来维护用户帐户。令牌用于上传/下载任何文件,firebase用作聊天服务器。

规则设置为.read = true和.write = true;一切正常,但是当我尝试进行身份验证时,会导致上述错误。我已经尝试使用令牌生成器中的令牌来检查我是否可能使用了错误的令牌。

我按照这个例子为firebase auth生成令牌:

https://www.firebase.com/docs/web/guide/login/custom.html

由于存储firebase密钥在安全性方面不好,可以遵循哪些其他替代方法来生成用于身份验证的令牌?

2 个答案:

答案 0 :(得分:3)

我太过坚持这一点了,这就是帮助我的原因。

首先,有两种类型的用户可以从firebase访问数据库

  1. 授权
  2. 非授权的
  3. 默认情况下,它设置为未授权但后来没有任何读取或写入权限,因此,如果您尝试执行任何操作,则最初会收到权限被拒绝错误。

    因此,基本上必须更改firebase控制台上所需的权限才能访问数据库。

    完整答案here

答案 1 :(得分:3)

检查您的firebase帐户中定义的规则以及模拟器选项。下面在图像中给出描述。

enter image description here