Метаданные хранилища Firebase не включены в правила безопасности - PullRequest
1 голос
/ 27 сентября 2019

Я пытаюсь реализовать правила хранения 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"}

Что я делаю не так?Любая помощь приветствуется!

1 Ответ

0 голосов
/ 30 сентября 2019

Я связался со службой поддержки Firebase, и решение, которое они дали, заключалось в том, чтобы обернуть ваш объект метаданных внутри customMetadata, как показано ниже:

storageRef
.put(payload.file, {
   customMetadata: { //This is the required key
      userId: <your user id data>
   }
})

NB! Это, похоже, задокументировано здесь

...