Правила хранения Firebase игнорируются с помощью rest API

Я использую python 2.7 для своего внешнего интерфейса, поэтому я вынужден использовать rest API для запуска облачных функций для управления всеми операциями хранения.

Прямо сейчас я пытаюсь установить основные правила для хранения, которые делают следующее:

  • Все пользователи могут читать
  • Только аутентифицированные пользователи с совпадающим uid могут записывать в соответствующее хранилище.

Вот правила хранения:

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read;
    }
    match /{userId}/{allPaths=**} {
      allow write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

Я заметил, что мое правило записи не работает, хотя при использовании игровой площадки правил в консоли оно проверяет и отклоняет, как и ожидалось.

Я жестко запрограммировал свою облачную функцию для записи в хранилище с определенным uid в пути, поэтому теоретически только тот пользователь с совпадающим uid должен иметь возможность писать в нее. Хотя, если я аутентифицируюсь с другой учетной записью, он все равно может написать, когда ему должно быть отказано. Так почему же он игнорирует мои правила хранения?

В Python я вызываю конечную точку следующим образом:

img_url = "C:/Users/USER/pic.jpg"
with open(img_url, "r") as f:
    img_data = f.read().encode("base64")

url = "https://us-central1-[REDACTED].cloudfunctions.net/upload?key = {apiKey}".format(apiKey=api_key)
params = {"imgData": img_data, "idToken": id_token, "mediaType": "image/jpeg"}
headers = {"Content-type": "application/json", "Authorization": "Bearer " + id_token}
response = requests.post(url, headers=headers, data=json.dumps(params))
print response

Ответ будет 200, и файл будет успешно записан, даже если токен идентификатора, который я передаю, предназначен для другого пользователя.

Игнорируются ли правила хранения, если я прохожу паузу? Нужно ли мне подтверждать это самостоятельно в облачной функции?

Если это имеет значение, в облачной функции я использую admin.storage.bucket.file.save для записи.

Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
254
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Когда вы получаете доступ к службам Firebase с помощью Firebase Admin SDK, все правила безопасности полностью игнорируются. Это относится к облачным функциям, которые используют Admin SDK.

Другими словами, правила безопасности применяются только к «прямому» доступу веб-клиентов и мобильных клиентов.


Итак, отвечая на ваши вопросы:

Игнорируются ли правила хранения, если я прохожу паузу?

На самом деле вы вызываете Облачную функцию HTTPS, которая, в свою очередь, взаимодействует с сервисом Cloud Storage. Это немного отличается от «прохода через REST API». Вот почему «правила хранения игнорируются».

Нужно ли мне подтверждать это самостоятельно в облачной функции?

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

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