2015-08-31 4 views
3

Я пытаюсь создать приложение чата с использованием 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 секретный ключ плох с точки зрения безопасности, что другие альтернативы можно следовать, чтобы генерировать маркер для аутентификации ?

+0

ли вы подтвердить, что ваше приложение может установить данные на вашем сервере? – JoxTraex

+0

Да, я использую секретный ключ безопасности, сгенерированный в firebase, я пробовал без auth-процесса, имея .read: true и .write: true, приложение работает очень хорошо. Мне нужна ссылка на идентификатор сообщения, так что я могу обновить/удалить его, вот в который входят 2 идентификатора, один для идентификации сообщений и другой для push. –

+1

Если вы создаете токены в приложении, которое вы отправляете своим пользователям, это означает, что вы вставляете секрет вашей Firebase в свой APK. Кто-то извлечет ваш APK, захватит ваш ключ и сможет нанести ущерб вашим данным Firebase. Будьте в безопасности от этого сценария и * не генерируйте токены в приложении, которые вы отправляете своим пользователям *. –

ответ

2

Я был слишком застрял в этом вопросе, и вот что мне помогло.

Перво-наперво, есть два типа пользователей, которые могут получить доступ к базе данных из firebase

  1. Авторизованных
  2. Неавторизованного

По умолчанию он установлен в несанкционированный, но затем у них нет разрешений, которые не читаются и не записываются, поэтому, если вы попытаетесь выполнить какую-либо операцию, вы получите отказ в разрешении.

Таким образом, в основном необходимо изменить требуемые разрешения на консоли firebase для доступа к базе данных.

Полный ответ here

2

Проверьте правила определены в вашем firebase счета, а также параметры тренажера. Описание приведено ниже на изображении.

enter image description here

+0

отредактируйте ur ответ и загрузите изображение правильно http://stackoverflow.com/questions/28496851/how-to-upload-pictures-to-stackoverflow-for-posting –