Проверка пользовательских утверждений пользователя (является администратором) при входе в систему с помощью React, Redux и Firebase - PullRequest
0 голосов
/ 27 сентября 2019

Мне было интересно, может ли кто-нибудь мне помочь.

В настоящее время я создаю панель администратора, к которой могут обращаться только администраторы.Я использую React, Redux и Firebase.

Мне удалось настроить пользовательские требования для определенных пользователей в облачной функции, например, так:

exports.addSuperAdminRole = functions.https.onCall((data, context) => {
  return admin.auth().getUserByEmail(data.email).then(user => {
    return admin.auth().setCustomUserClaims(user.uid, {
      superAdmin: true
    })
  }).then(() => {
    return {
      message: `Success! ${data.email} has been made an admin.`
    }
  }).catch(err => {
    return err;
  });
});

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

В настоящее время у меня работает следующее действие входа на стороне клиента, где я проверяю пользовательское утверждение и просто выходу пользователя из системы, еслиони не администраторы:

export const login = creds => {
  return async (dispatch, getState, { getFirebase }) => {
    const firebase = getFirebase();
    try {
      await firebase
        .auth()
        .signInWithEmailAndPassword(creds.email, creds.password);

        const currentUser = firebase.auth().currentUser;
        currentUser.getIdTokenResult().then(idTokenResult => {
          console.log(currentUser);
          currentUser.superAdmin = idTokenResult.claims.superAdmin;

          if (!currentUser.superAdmin) {
            console.log('is not admin');
            firebase.logout();
          }
        });

    } catch (error) {
      console.log(error);
      throw new SubmissionError({
        _error: 'Login failed'
      });
    }
  };
};

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

Буду признателен за любую помощь, которую вы мне можете оказать!

Приветствия,

Джеймс

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Обратите внимание, что в любом случае наиболее важно то, что вы правильно защитили свою базу данных с помощью правил безопасности, включающих superAdmin требование .

На самом деле, любой, кто знает URL вашей панели администратора, может легко получить вашу конфигурацию Firebase (даже если они не вошли в систему, так как этот объект конфигурации встроен в js-файлы вашего приложения),Затем они могут реализовать свою собственную веб-страницу, которая вызывает метод signInWithEmailAndPassword() без выхода из системы .

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

Заключение : скрытие страниц панели администратора (или элементов меню администратора, и / или кнопок администратора),на основе утверждений (т. е. «изменения клиентского интерфейса на основе роли пользователя или уровня доступа», как описано в doc ) достаточно, зная, что ваша база данных правильно защищена .

0 голосов
/ 28 сентября 2019

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

...