Я хочу ограничить возможность пользователей входить в мое приложение Firestore, используя определенный домен gmail. Я нашел аналогичный вопрос здесь, но он полностью отличается от Firestore. Итак, позвольте мне объяснить мое требование, чего я хочу.
Предположим, одна компания под названием abc.com использует службы Gmail и интегрировала все свои учетные записи электронной почты в Gmail. Таким образом, они могут использовать почтовые службы Gmail, используя эту учетную запись. Поэтому я хочу ограничить пользователей, которые используют только учетную запись Gmail [email protected] для входа в мое приложение firestore.
Я много искал, но не нашел документации по этому поводу.
@RenaudTarnec, который ограничивает доступ пользователя к уровню записи, но я не хочу иметь возможность регистрироваться или входить в систему, используя другую учетную запись.
@ Неизвестно, я понимаю, что тебе нужно. Дело в том, что если вы используете стандартную аутентификацию электронной почты Firebase, вы не можете запретить кому-либо входить в ваш проект Firebase с любым адресом электронной почты, который они хотят: т.е. они появятся в списке пользователей в консоли Firebase. Это может показаться странным, но именно эту модель выбрали создатели Firebase. Единственное, что вы можете сделать, - это защитить свои базы данных / службы с помощью правил безопасности и разрешить доступ только пользователям с адресами электронной почты, соответствующими желаемому домену.
@RenaudTarnec Я использую аутентификацию Gmail, и я нашел setHostedDomain, который я пробовал, но все еще не работает должным образом.
Хорошо, я не понял, что вы используете аутентификацию Gmail. Так что извините и ... удачи! (Поскольку я не думаю, что могу вам помочь)
Похоже, для этого нет надежного решения Firestore, но у меня есть составное решение:
Извините за вставку фрагментов, но мне не удалось заставить программу форматирования отформатировать весь код.
Код моего компонента:
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 использовать аутентификацию. Вы ограничиваете только пользовательский интерфейс, а не систему
Взгляните на stackoverflow.com/questions/36943350/… и stackoverflow.com/questions/24063435/…. Вы не можете ограничить пользователей для создания учетной записи, но вы можете ограничить круг лиц, имеющих доступ к службам (Firestore, база данных реального времени и т. д.) С помощью правил безопасности. См. Документ о защите Firestore firebase.google.com/docs/firestore/security/get-started. Смотрите также