Как создать защищенный и безопасный раздел администратора для веб-приложения Firebase? - PullRequest
0 голосов
/ 11 июня 2019

У меня есть приложение Firebase, которое является базовым сайтом для блогов. У меня не будет никакой аутентификации для обычных пользователей. Но мне нужен способ аутентификации и / или авторизации admin для создания сообщений в блоге.

Сейчас у меня все настроено в одном проекте Firebase, и я планирую иметь защищенный маршрут "hidden", например www.myFirebaseProject.com/admin-xyz. PS: я знаю, что это не полностью скрыто, но я имею в виду, что это не доступно через клики.

Когда admin попадет на этот URL, они предоставят username и password, и им будет предоставлено разрешение на доступ к админ-панелям и создание сообщений для блога.

У меня, вероятно, не будет страницы и / или формы для создания учетной записи , поскольку я могу и буду вручную создавать и регистрировать пользователей с правами администратора прямо из консоли Firebase.

enter image description here

Моя главная проблема в том, чтобы любой злоумышленник мог получить доступ к моему проекту Firebase и создать новые учетные записи, используя firebase.auth().createUserWithEmailAndPassword();, я прав?

Из того, что я до сих пор думал, у меня есть два варианта сделать это, сохраняя при этом:

ВАРИАНТ 1:

  • Создайте двух пользователей и вручную установите флаг admin в документах их пользователей в моей базе данных (Firestore). Коллекция user и ее документы, очевидно, будут защищены от любых писем с этого момента.

  • Используйте этот флаг из Firestore для авторизации пользователей в разделе администратора.

ВАРИАНТ 2:

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

Роли пользователя могут быть определены для следующих распространенных случаев:

  • Предоставление пользователю административных прав доступа к данным и ресурсам.
  • Определение различных групп, к которым принадлежит пользователь.
  • Предоставление многоуровневого доступа:
    • Различение платных / неоплачиваемых абонентов.
    • Отличение модераторов от обычных пользователей.
    • Заявление учителя / ученика и т. Д.
  • Добавить дополнительный идентификатор пользователя. Например, пользователь Firebase может сопоставить другой UID в другой системе.

ВОПРОС 1:

  1. Я прав, что любой злоумышленник может создать новые учетные записи, просто проверив приведенную ниже информацию о Firebase?
var firebaseConfig = {
  apiKey: "api-key",
  authDomain: "project-id.firebaseapp.com",
  databaseURL: "https://project-id.firebaseio.com",
  projectId: "project-id",
  storageBucket: "project-id.appspot.com",
  messagingSenderId: "sender-id",
  appID: "app-id",
};

ВОПРОС 2:

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

1 Ответ

1 голос
/ 11 июня 2019

Вопрос 1:

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

Вопрос 2:

Если вам иногда приходится создавать администраторов, которых вы будете отмечать вручную, вы можете перейти к пользовательским утверждениям. Использование базы данных для пользовательских ролей дает вам больше гибкости в управлении ролями. Затем вы можете использовать эти утверждения в своем интерфейсе (например, angular auth guard) для обеспечения доступа ролей администратора к вашим представлениям.

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

...