Я пытаюсь реализовать правила хранения Firebase, чтобы только автор сообщения мог создать его, удалить и обновить.Проблема в том, что в симуляторе он работает отлично, а в реальном случае - нет.Мне кажется, что метаданные, которые я использую, не отображаются в правилах или не включены в запрос на поставку.
Я делаю все, как написано в документации:
Это мои правила:
service firebase.storage {
match /b/{bucket}/o {
//Posts
match /{allImages=**} {
allow read: if authenticated();
allow create: if authenticated() && metadata().userId == request.auth.uid;
allow update, delete: if authenticated() && metadata().userId == request.auth.uid;
}
}
function metadata() { return request.resource.metadata; }
function authenticated() { return request.auth.uid != null; }
}
И это функцияЯ использую для загрузки файла или файлов:
uploadFile({ commit, rootState }, payload) {
const storageRef = firebase
.storage()
.ref(`posts/${payload.id}/${payload.index}/${payload.index}`)
commit('app/setError', null, { root: true })
commit('app/setLoading', true, { root: true })
return new Promise((resolve, reject) => {
storageRef
.put(payload.file, {
userId: rootState.authentication.user.id
}) //HERE IS THE METADATA AS THE SECOND PARAMETER (userId)
.then(snapshot => {
snapshot.ref.getDownloadURL().then(downloadURL => {
resolve(downloadURL)
commit('app/setLoading', false, { root: true })
})
})
.catch(error => {
reject(error)
commit('app/setError', error, { root: true })
commit('app/setLoading', false, { root: true })
})
})
},
Редактировать 1 : это метаданные объекта, которые я тестирую внутри симулятора:
{"metadata":{"userId":"9PuxRiKI17Y8hbwW9aVISpdrpZa2"},"name":"b/myprojectid-develop.appspot.com/o/posts/{postId}","bucket":"myprojectid-develop.appspot.com"}
, и это уменьшаетсяОбъект, который я публикую в реальном регистре в качестве метаданных:
{"userId":"9PuxRiKI17Y8hbwW9aVISpdrpZa2"}
Что я делаю не так?Любая помощь приветствуется!