Что такое безопасная модель данных в Firestore для приложений, основанных на местоположении?

#swift #firebase #google-cloud-firestore

#swift #firebase #google-облако-firestore

Вопрос:

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

 db.collection("Users").whereField("geohash", >=: geohash_prefix)
.whereField("geohash", <=: "geohash_prefix"   "~").getDocuments { (querySnapshot, err) in
         if err != nil{
            print("(err!.localizedDescription)")
         }else{
                if querySnapshot!.isEmpty{
                    return completion(arr_of_users)
                }
                for document in querySnapshot!.documents {
                    let d = document.data()
                    let isWithin = CLLocationCoordinate2D(latitude: (d["loc"] as! GeoPoint).latitude, longitude: (d["location"] as! GeoPoint).longitude).isWithin(min: self.MBR.1, max: self.MBR.0) //just used for filtering documents not in radius
                    if !isWithin{ //skip all docs not in range
                         continue
                    }
                    nearPeople.append([d["firstName"] as! String,  d["lastName"] as! String])
                }
                    

}
  

Итак, вы можете видеть, что для отображения имени и фамилии пользователя для всех, кто находится в радиусе 10 миль, я должен отправлять данные о местоположении клиенту, что небезопасно. Я также не могу разделить его на вложенную коллекцию, потому что мне нужно получить имена и другую общедоступную информацию, для которой потребуется второй запрос (больше чтений). Я знаю, что Google cloud functions полностью изолирован от клиента, так что это мой единственный вариант? Это приведет к снижению производительности? Кроме того, я уверен, что приложения такого типа не редкость, каков наиболее распространенный подход к этому?

Комментарии:

1. Привет, Кунал. Я попытался уточнить ниже. У вас была возможность прочитать это? Это лучше объясняет, почему вы не можете безопасно запрашивать эти данные непосредственно из кода приложения?

2. Привет, Фрэнк. Да, сейчас я использую облачные функции для выполнения запросов к геохешам. Вы также упомянули, что пользователь может изменить свое местоположение для запроса из любого места, но решена ли эта проблема сейчас, поскольку они не могут получить данные о местоположении, поскольку они защищены облачной функцией?

Ответ №1:

Как я уже говорил на ваш предыдущий вопрос: чтобы иметь возможность запрашивать определенные данные, пользователь должен иметь возможность читать эти данные. И поскольку Firestore не может выполнить ваше isWithin(min: self.MBR.1, max: self.MBR.0) условие на сервере, это означает, что им, по крайней мере, потребуется доступ ко всем данным внутри db.collection("Users").whereField("geohash", >=: geohash_prefix).whereField("geohash", <=: "geohash_prefix" "~") .

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

Ваш самый прямой подход — сделать это действительно в облачных функциях.


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