Разрешение на хранение Firebase продолжает отклоняться

Мое правило хранилища Firebase теперь установлено следующим образом:

rules_version = '2';

// Craft rules based on data in your Firestore database
// allow write: if firestore.get(
//    /databases/(default)/documents/users/$(request.auth.uid)).data.isAdmin;
service firebase.storage {
  match /b/{bucket}/o {
    match /user/{userId}/{allPaths=**} {
      allow read,write: if request.auth.uid == userId;
    }
  }
}

И мой код Python для загрузки изображения:

        self.storage.child(self.uid + '/'+fNameonServer+'.png').put(self.path_here + '/dummy.png')

И вот сообщение об ошибке, которое я вижу.

  File "C:\Users\bboyc\PycharmProjects\turtle\.venv\turtle_main.py", line 1140, in uploadImage
    self.storage.child(self.uid + '/'+fNameonServer+'.png').put(self.path_here + '/dummy.png')
  File "C:\Users\bboyc\PycharmProjects\turtle\.venv\lib\site-packages\pyrebaselite\pyrebaselite.py", line 464, in put
    raise_detailed_error(request_object)
  File "C:\Users\bboyc\PycharmProjects\turtle\.venv\lib\site-packages\pyrebaselite\pyrebaselite.py", line 511, in raise_detailed_error
    raise HTTPError(e, request_object.text)
requests.exceptions.HTTPError: [Errno 403 Client Error: Forbidden for url: https://firebasestorage.googleapis.com/v0/b/jost-19f5e.appspot.com/o?name=lKIp1f9k05RmwP6CRWo6qT2Bcir1/imgJustice.png] {
  "error": {
    "code": 403,
    "message": "Permission denied."
  }
}

Я думаю, что это должна быть ошибка правила хранения, поскольку этот код работал, когда правило хранения касалось только даты, но он не работает, даже если правило не регулируется. Проблема в том, что я не могу понять, что не так с этим правилом. Я хочу сделать хранилище доступным только в том случае, если пользователь вошел в систему.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваши правила безопасности сопоставляют пути объектов по следующему шаблону:

/user/{userId}/{allPaths=**}

Но ваш код вообще не использует /user в префиксе, поэтому правило не разрешает запись.

Вам следует изменить свой код, чтобы он соответствовал правилу, или изменить правило, чтобы оно соответствовало вашему коду. Если вы изменили свой код, он может выглядеть так:

self.storage.child('/user/' + self.uid + '/'+fNameonServer+'.png')

Я немного изменил правило на ``` match /{userId}/{allPaths=**} {allow read,write: if request.auth != null; } ``` и удалось загрузить, хотя в моем правиле нет if request.auth != null. Однако мне по-прежнему выдается ошибка 403, когда я хочу разрешить загрузку только при загрузке.

MooNChilD Song 26.05.2024 03:19

Почему бы тебе сначала не попробовать воспользоваться моим предложением? Я не думаю, что всегда сопоставлять первый компонент пути с переменным идентификатором пользователя — хорошая идея. Это не поможет вам организовать непользовательский контент в будущем.

Doug Stevenson 26.05.2024 03:39

Я понял, что создаю только папку {userId} в Storage, поэтому дерево выглядит как Storage/userId/Filename.png . Поэтому, следуя вашему предложению, я подумал, что изменение правила более адекватно. На самом деле правило, которое я сейчас использую для теста, — match /{userId}/{allPaths=**} { allow read,write; }, и загрузка выполняется очень хорошо. Но я до сих пор не могу понять, почему разрешение по uid не работает.

MooNChilD Song 26.05.2024 03:44

Но я глубоко понимаю, что ваше предложение правильное. Я попробую ваше предложение на 100% как можно скорее и оставлю еще один комментарий. Большое спасибо.

MooNChilD Song 26.05.2024 03:48

Я просто последовал вашему предложению, изменил правила и свой код, но не смог сделать это правильно. Можете ли вы подсказать мне, чего мне не хватает?

MooNChilD Song 26.05.2024 05:15

Другие вопросы по теме

Распространение приложений Firebase, не удается пройти аутентификацию с помощью учетной записи службы
Внезапно получите 200 строк ошибок Firebase
Распространение приложений Firebase: нажмите «Загрузить», «Элемент не найден» в Play Store
Возникла проблема при оценке проекта «:react-native-firebase_app». Слишком поздно задавать пространство имен. Он уже прочитан для настройки этого проекта
Firebase Auth Next.JS с промежуточным программным обеспечением
Next.js 14: ошибка неопределенного значения при сериализации продуктов в getServerSideProps
Flutter run не работает для проекта Firebase Android. Ошибка: двоичная версия метаданных — 1.9.0, ожидаемая версия — 1.7.1
Firebase Storage putFile/putData не работает
Ошибка: [auth/missing-client-identifier] В этом запросе отсутствует действительный идентификатор приложения, проверки целостности Play и проверки reCAPTCHA не увенчались успехом
Можно ли настроить Firebase так, чтобы при отключении пользователя срок действия его токена истекал?