我正在嘗試使用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數據造成嚴重破壞。請保持您的安全,避免這種情況發生,*不要在您向用戶發送的應用程序中生成令牌*。 –