Я пытаюсь создать приложение чата с использованием firebase.Firebase: Permission denied - while setValue()
Структура для таблицы сообщений:
message -
$message_id
- $message_push_id
- message {
sender : 3,
receiver : 58,
token : token_of_sender,
message : hi
....}
message_id здесь генерируется с помощью передатчика и приемника иды «3_58»
Я использую толчок для сохранения сообщений в 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 в/сообщения/3_58/-Jy2We4cqLjuQNF6Oyhs не удалось: FirebaseError: разрешение отклонено
Я не могу понять, где я - 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; все работает, однако, когда я пытаюсь выполнить аутентификацию, это приводит к ошибке, упомянутой выше. Я попытался использовать токен из генератора токенов, чтобы проверить, могу ли я использовать неправильный токен.
Я выполняю этот пример, чтобы генерировать маркер для firebase идентификации:
https://www.firebase.com/docs/web/guide/login/custom.html
С хранения firebase секретный ключ плох с точки зрения безопасности, что другие альтернативы можно следовать, чтобы генерировать маркер для аутентификации ?
ли вы подтвердить, что ваше приложение может установить данные на вашем сервере? – JoxTraex
Да, я использую секретный ключ безопасности, сгенерированный в firebase, я пробовал без auth-процесса, имея .read: true и .write: true, приложение работает очень хорошо. Мне нужна ссылка на идентификатор сообщения, так что я могу обновить/удалить его, вот в который входят 2 идентификатора, один для идентификации сообщений и другой для push. –
Если вы создаете токены в приложении, которое вы отправляете своим пользователям, это означает, что вы вставляете секрет вашей Firebase в свой APK. Кто-то извлечет ваш APK, захватит ваш ключ и сможет нанести ущерб вашим данным Firebase. Будьте в безопасности от этого сценария и * не генерируйте токены в приложении, которые вы отправляете своим пользователям *. –