2015-08-31 288 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 –