Ограничить вход в Firestore Gmail для определенного домена

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

Предположим, одна компания под названием abc.com использует службы Gmail и интегрировала все свои учетные записи электронной почты в Gmail. Таким образом, они могут использовать почтовые службы Gmail, используя эту учетную запись. Поэтому я хочу ограничить пользователей, которые используют только учетную запись Gmail [email protected] для входа в мое приложение firestore.

Я много искал, но не нашел документации по этому поводу.

Взгляните на stackoverflow.com/questions/36943350/… и stackoverflow.com/questions/24063435/…. Вы не можете ограничить пользователей для создания учетной записи, но вы можете ограничить круг лиц, имеющих доступ к службам (Firestore, база данных реального времени и т. д.) С помощью правил безопасности. См. Документ о защите Firestore firebase.google.com/docs/firestore/security/get-started. Смотрите также

Renaud Tarnec 23.04.2018 18:35

@RenaudTarnec, который ограничивает доступ пользователя к уровню записи, но я не хочу иметь возможность регистрироваться или входить в систему, используя другую учетную запись.

Asif Mushtaq 23.04.2018 19:21

@ Неизвестно, я понимаю, что тебе нужно. Дело в том, что если вы используете стандартную аутентификацию электронной почты Firebase, вы не можете запретить кому-либо входить в ваш проект Firebase с любым адресом электронной почты, который они хотят: т.е. они появятся в списке пользователей в консоли Firebase. Это может показаться странным, но именно эту модель выбрали создатели Firebase. Единственное, что вы можете сделать, - это защитить свои базы данных / службы с помощью правил безопасности и разрешить доступ только пользователям с адресами электронной почты, соответствующими желаемому домену.

Renaud Tarnec 23.04.2018 20:38

@RenaudTarnec Я использую аутентификацию Gmail, и я нашел setHostedDomain, который я пробовал, но все еще не работает должным образом.

Asif Mushtaq 23.04.2018 21:03

Хорошо, я не понял, что вы используете аутентификацию Gmail. Так что извините и ... удачи! (Поскольку я не думаю, что могу вам помочь)

Renaud Tarnec 23.04.2018 21:05
1
5
3 070
2

Ответы 2

Похоже, для этого нет надежного решения Firestore, но у меня есть составное решение:

  • Правило безопасности при первом доступе к сбору данных, где я проверяю домен электронной почты.
  • Ошибка catchError при извлечении данных, при которой я проверяю код ошибки "доступ запрещен".
  • Обработчик ошибок, который вызовет службу аутентификации и принудительно завершит сеанс с перенаправлением на неавторизованную страницу.

Извините за вставку фрагментов, но мне не удалось заставить программу форматирования отформатировать весь код.

Код моего компонента:

  ngOnInit(): void {
    this.leadsDataSubscription = this.leadService.getLeadsSnapshot()
      .pipe(
        catchError((e: any) => Observable.throw(this.errorHandler(e)))
      )
      .subscribe(data => {
        this.leadsDataSource.data = data;
        this.leadsDataSource.paginator = this.paginator;
        this.leadsDataSource.sort = this.sort;
      });
    this.currentUser = this.authSvc.getCurrentUser();
  }

  private errorHandler(error: any) {
    if (error.name === 'FirebaseError' && error.code === 'permission-denied') {
      this.leadsDataSubscription.unsubscribe()
      this.authSvc.logout('/unauthorized');
    }
  }

Мой сервисный код

  logout(redirectURL?: string) {
    this.unsubscribe()
    this.afAuth.auth.signOut()
      .then(response => {
        this.snackBar.open('Signed out');
        this.router.navigate([redirectURL || '/']);
      })
      .catch(error => this.snackBar.open('Error signing out: ' + error));
  }

И правила Firestore:

match /leads/{document=**} {
  allow read: if isAllowedDomain() && isSignedIn();
  allow update: if isAllowedDomain() && isSignedIn() && canUpdate()
  allow delete: if isAllowedDomain() && isSignedIn() && isCreator() && canWrite() || isGod()
  allow create: if isAllowedDomain() && isSignedIn() && userExists();
}
function isAllowedDomain() {
    return request.auth.token.email_verified == true &&
               request.auth.token.email.matches(".*@workdomain.se") ||
               request.auth.token.email.matches(".*@privatedomain.org")
}

Вы не можете ограничивать домены в аутентификации по электронной почте или в аутентификации Gmail. Это компромисс, на который вы должны пойти при использовании стороннего решения, например Firebase, для аутентификации.

В случае аутентификации gmail на Android вы можете сначала прочитать учетные записи Gmail, доступные на устройстве, а затем отображать учетные записи только в том случае, если домен совпадает. Таким образом, вы можете хотя бы ограничить пользователя на уровне пользовательского интерфейса определенным доменом.

НО будьте осторожны, пользователь все равно может выполнить еще один вход в домен, поскольку firebase позволяет всем учетным записям Gmail использовать аутентификацию. Вы ограничиваете только пользовательский интерфейс, а не систему

Другие вопросы по теме