2015-08-31 287 views
3

我正在尝试使用Firebase构建聊天应用程序。Firebase:权限被拒绝 - setValue()

用于消息表的结构:使用发送者和接收者的ID “3_58”

我使用推送将信息储存到火力产生这里

message - 
    $message_id 
    - $message_push_id 
     - message { 
     sender : 3, 
     receiver : 58, 
     token : token_of_sender, 
     message : hi 
     ....} 

MESSAGE_ID。

{ 
    "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方法在/消息/ 3_58/-Jy2We4cqLjuQNF6Oyhs失败:FirebaseError:Permission denied

我无法弄清楚我在哪里goi恩错了。

这是发送聊天的代码:

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;一切正常,但是当我尝试进行身份验证时,会导致上述错误。我试过使用令牌生成器中的令牌来检查我是否可能使用了错误的令牌。

我下面这个例子来生成火力身份验证令牌:

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

由于存储火力密钥在安全性方面是不好的,还有什么其他替代可以遵循生成认证令牌?

+0

你有没有验证您的应用程序允许设置您的服务器上的数据? – JoxTraex

+0

是的,我正在使用firebase中生成的安全密钥,我尝试了无验证过程,拥有.read:true和.write:true,该应用程序运行良好。我需要一个对消息ID的引用,以便我可以更新/删除它,这是2个ID进来的地方,一个用于消息标识,另一个用于推送。 –

+1

如果您在发送给用户的应用中生成令牌,这意味着您将Firebase的秘密嵌入到APK中。有人会提取您的APK,抓住您的密钥,并能够对您的Firebase数据造成严重破坏。请保持您的安全,避免这种情况发生,*不要在您向用户发送的应用程序中生成令牌*。 –

回答

2

我太困扰这一点,这是什么帮助我。

首先第一件事情,有两种类型的用户谁可以从火力

  1. 授权访问数据库
  2. 非授权

默认情况下,它被设置到非授权但随后他们没有任何权限,既没有读也没有写,所以最初如果你尝试执行任何操作,你会得到权限被拒绝的错误。

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

完整回答here

2

检查您的火力帐户定义的规则,也是模拟器选项。描述在下面的图像中给出。

enter image description here

+0

请编辑你的答案,并正确上传图片http://stackoverflow.com/questions/28496851/how-to-upload-pictures-to-stackoverflow-for-posting –