Подтвердить что ты не робот

Правильные правила авторизации для защищенного контента в firebase

Существует ли передовой подход к правилам авторизации для защищенного контента в приложении firebase

  • с использованием firepad специально
  • По защищенному контенту я имею в виду, когда пользователь создает документ и делится им только с некоторыми другими пользователями).
  • Также мне нужно иметь возможность запрашивать firebase для всех документов, к которым у меня есть доступ (документы, которые я создал, и другие документы, которыми я пользуюсь вместе со мной)

Некоторые из моих исследований до сих пор:

Метод 1: секретный URL

  • Мне нужно знать URL-адрес, чтобы иметь возможность просматривать/редактировать документ

  • Недействительная авторизация, так как любой зарегистрированный пользователь, имеющий доступ к этому URL, может редактировать/изменять его.

  • Невозможно указать все документы, к которым у меня есть доступ к

Способ 2: Использование правил авторизации firebase для добавления пользователей в документ и проверки того, является ли пользователь document.users перед чтением/записью.

Снято с: Возможно ли защищенный контент в Firebase?

{

"documents": {

   "$documents_id": {

       // any friend can read my post

       ".read":  "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()",

       // any friend can edit my post
       ".write": "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()"

   },

   users:{

   // List of user.ids that have access to this document

   }

}

}

Плюсы:

  • Надлежащая авторизация/аутентификация. Только пользователи, прошедшие проверку подлинности, которым предоставлен доступ, могут просматривать/редактировать.

Минусы:

  • Невозможно запросить все документы, которые пользователь может редактировать (те, которые у меня есть или были разделены со мной) (Правильно ли это предположение?)

Способ 3: правила авторизации Firebase (метод 2) плюс избыточный магазин пользователей с массивом документов, к которым имеют доступ каждый пользователь. Это хранилище пользователей будет использоваться только для запроса всех документов, к которым пользователь имеет доступ. то есть:

{
"documents": {
   "$documents_id": {
       // any friend can read my post
       ".read":  "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()",
       // any friend can edit my post
       ".write": "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()"
   }
},
"users":{
    "$user":{
        ".read": "auth.id=$user.id",
        ".write": "auth.id=$user.id"
        "$documents":{
            // All the documents i have access to. This list gets ammended whenever I am granted/stripped access to a document.
        }
    }
}
}

Плюсы:

  • Надлежащая аутентификация/авторизация

Минусы:

  • Повторяющиеся данные должны иметь дело с проблемами синхронизации между двумя хранилищами данных. Это просто не кажется хорошей идеей.

Метод 4: Группы

Использование групп в Предоставление доступа к местам Firebase группе пользователей

  • У нас есть группа для каждого документа в хранилище данных

  • Невозможно запросить firebase для всех документов, к которым пользователь может получить доступ.

Есть ли лучший способ сделать это?

4b9b3361

Ответ 1

Вы проделали хорошую работу по перечислению опций, и вы определенно на правильном пути. Как вы обнаружили, нет способа запроса на основе правил безопасности. Это было сделано намеренно, поскольку (в зависимости от ваших правил безопасности) это может быть довольно дорого (Firebase позволяет избежать сложных запросов в целом по этой причине).

Итак, ваш метод 3 - это правильный способ сделать это. Дублирование данных для подобных ситуаций на самом деле является очень распространенной практикой. См. Денормализация ваших данных в обычном формате для сообщения в блоге, которое более подробно описано на этом.

Вы также можете сделать метод 1 с дублированным списком документов. Это особенно полезно, если вы хотите "пригласить" кого-то в документ только с URL-адресом (который содержит секретный идентификатор). Или вы можете сделать комбинацию из двух (некоторые документы будут "общедоступными, но не внесенными в список", а некоторые будут "частными приглашенными друзьями" или что-то еще.)