我正在尝试使用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密钥在安全性方面不好,可以遵循哪些其他替代方法来生成用于身份验证的令牌?
答案 0 :(得分:3)
我太过坚持这一点了,这就是帮助我的原因。
首先,有两种类型的用户可以从firebase访问数据库
默认情况下,它设置为未授权但后来没有任何读取或写入权限,因此,如果您尝试执行任何操作,则最初会收到权限被拒绝错误。
因此,基本上必须更改firebase控制台上所需的权限才能访问数据库。
完整答案here
答案 1 :(得分:3)