Правила подстановочных знаков хранилища Firebase с пользовательскими токенами

#firebase #firebase-storage #firebase-security

#firebase #firebase-хранилище #firebase-безопасность

Вопрос:

По какой-то причине я не могу заставить подстановочные знаки работать в пути с пользовательскими токенами. Пользователь назначает пользовательские токены следующим образом admin: true и ySWLb8NSTj9sur6n2CbS: true

 service firebase.storage {
  match /b/{bucket}/o {
        match /conferences/{confId}/sponsors/{sponsId=**} {
        allow read: if request.auth.uid != null
        allow write: if request.auth.token.confId == true
    }
  }
}
  

Я пытаюсь записать в /conferences/ySWLb8NSTj9sur6n2CbS/sponsors/whatever.jpeg от клиента и получил отказ в доступе.

Если я сейчас изменю их на приведенные ниже, это сработает без проблем.

 service firebase.storage {
  match /b/{bucket}/o {
        match /conferences/{confId}/sponsors/{sponsId=**} {
        allow read: if request.auth.uid != null
        allow write: if request.auth.token.admin == true
    }
  }
}
  

Я даже протестировал это, изменив пользовательский токен на ySWLb8NSTj9sur6n2CbS: "ySWLb8NSTj9sur6n2CbS" , а затем безуспешно попробовал нижеприведенное и получил отказ в доступе!

 service firebase.storage {
  match /b/{bucket}/o {
        match /conferences/{confId}/sponsors/{sponsId=**} {
        allow read: if request.auth.uid != null
        allow write: if request.auth.token.confId == confId
    }
  }
}
  

У меня такое чувство, что подстановочный знак по какой-то причине не выбран, или я что-то здесь упускаю?
В документации я нашел это:https://firebase.google.com/docs/storage/security/user-security?authuser=0

Ответ №1:

Итак, я выяснил, что по какой-то странной причине это работает наоборот. Я назначил пользователю пользовательское утверждение в виде массива. В этом массиве у вас есть confId. Итак, я проверяю, есть ли соответствующий confId в этом массиве.

 service firebase.storage {
  match /b/{bucket}/o {
        match /conferences {
        match /{confId}/sponsors/{sponsorId} {
        allow read: if confId in request.auth.token.userEvents
        allow write: if confId in request.auth.token.adminEvents
      }
    }
  }
}