我正在尝试使用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
由于存储火力密钥在安全性方面是不好的,还有什么其他替代可以遵循生成认证令牌?
你有没有验证您的应用程序允许设置您的服务器上的数据? – JoxTraex
是的,我正在使用firebase中生成的安全密钥,我尝试了无验证过程,拥有.read:true和.write:true,该应用程序运行良好。我需要一个对消息ID的引用,以便我可以更新/删除它,这是2个ID进来的地方,一个用于消息标识,另一个用于推送。 –
如果您在发送给用户的应用中生成令牌,这意味着您将Firebase的秘密嵌入到APK中。有人会提取您的APK,抓住您的密钥,并能够对您的Firebase数据造成严重破坏。请保持您的安全,避免这种情况发生,*不要在您向用户发送的应用程序中生成令牌*。 –