Firestore, какое правило для чтения только из приложения Android и писать с помощью API KEY? - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть сомнения по поводу правил безопасности в Firestore.

Мой сценарий таков: приложение для Android, где пользователи будут только читать данные.Они не спасут, они ничего не изменят.Они не собираются регистрироваться.Это просто чтение данных.

Мне, со своей стороны, нужно написать в этой коллекции.Я планирую сделать это через cURL с использованием API KEY.

Я использую следующее правило:

  match /mycol/{document=**} {
  allow read: if request.auth.uid != null; allow  write: if true;
}

Я хочу запретить доступ к моей коллекции, например, по URLоткуда угодно:

https://firestore.googleapis.com/v1/projects/myproject/databases/(default)/documents/mydoc/mycol/

Например, чтобы боты не запускали неразборчивые запросы, которые бы наполнили мой счет ...

Я выполняюхорошие правила для этого случая (только чтение из приложения Android без аутентификации и запись через cURL с использованием API KEY)?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вы на самом деле не закрываете свою коллекцию, напротив, вы разрешаете кому-либо писать в нее.

Чтобы разрешить только самой себе писать в коллекцию, есть несколько вариантов.Вы можете использовать Admin SDK и написать небольшую программу, которая будет запускаться только с вашего компьютера.

Admin SDK игнорирует безопасность, поэтому вы можете удалить часть записи, и она будет работать только для вас.

match /mycol/{document=**} {
  allow read: if request.auth.uid != null;
}

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

Другим вариантом будет создание пользователя для себя и аутентификация с этим пользователем.Это может быть мобильное приложение, веб-приложение или приложение Node, например.Сделав это, вы можете создать настраиваемую заявку для своего пользователя и разрешить писать только пользователям с этой заявкой, например:

match /mycol/{document=**} {
  allow read: if request.auth.uid != null; allow write: if request.auth.token.admin;
}

Затем вы можете установить заявки для пользователя следующим образом (из узла):

await admin.auth().setCustomUserClaims("user_user_id", { admin: true });

Еще один вариант - создание облачной функции для записи в эту коллекцию.Облачные функции используют Admin SDK, поэтому правила безопасности также не применяются, если вы не хотите их использовать, используя вместо этого клиентский SDK Javascript.Затем в облачной функции вы могли бы проверить свой ключ API и всегда вызывать URL-адрес облачной функции вместо базы данных напрямую.

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

0 голосов
/ 25 февраля 2019

Поскольку вы пытаетесь пытаться читать только и писать только в определенных условиях. Попробуйте использовать эти правила.Здесь внутри условия укажите ключ API, если таковой имеется:

   service cloud.firestore {
      match /databases/{database}/documents {
        match /<some_path>/ {
          allow read: if <some_condition>;
         allow write: if <some_condition>;
}
      }
    } 

Для того, чтобы ориентироваться только на ваше приложение, вы должны получить токен приложения для этого, просто сделайте следующее:

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(this, instanceIdResult -> {
    String newToken = instanceIdResult.getToken();
    Log.e("newToken", newToken);
});

После запуска этого кодаперейдите в свой журнал и затем скопируйте токен, а затем просто укажите этот токен в вашем условии, для этого попробуйте создать идентификатор авторизации с токеном приложения, а затем сравните этот идентификатор авторизации с токеном приложения в правилах базы данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...