限制Firestore gmail登录到特定域

时间:2018-04-23 16:16:01

标签: android firebase google-cloud-firestore firebase-security

我想限制用户使用特定的gmail域在我的Firestore应用程序中登录。我发现了类似的问题here,但这与Firestore完全不同。所以让我解释一下我的要求。

假设一家名为abc.com的公司正在使用gmail服务,他们已将所有电子邮件帐户集成到gmail中。因此,他们可以使用该帐户使用Gmail电子邮件服务。所以我想限制只使用username@abc.com gmail帐户登录我的firestore应用程序的用户。

我搜索了很多,但没有找到任何关于此的文档。

2 个答案:

答案 0 :(得分:2)

似乎没有一个可靠的Firestore解决方案,但我有一个复合解决方案:

  • 关于访问的第一个数据收集的安全规则,我在此处检查电子邮件域
  • 有关数据检索的catchError,我在其中检查错误代码“ permission-denied”(允许拒绝)
  • 错误处理程序,它将调用身份验证服务并通过重定向到未经授权的页面来强制注销。

很抱歉粘贴代码段,但是我无法让格式化程序格式化所有代码。

我的组件代码:

docker stop <container-id>

docker start <container-id>

我的服务代码

  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');
    }
  }

Firestore规则:

  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));
  }

答案 1 :(得分:0)

您不能在电子邮件身份验证或Gmail身份验证中限制域。这是使用Firebase解决方案等第三方进行身份验证时必须做出的权衡。

在android上进行gmail身份验证的情况下,您可以做的是先读取设备上可用的gmail帐户,然后在域匹配时仅显示帐户。这样,您可以至少在UI级别上限制用户具有特定域。

请注意,由于Firebase允许所有gmail帐户使用身份验证,因此用户仍然可以再次进行域登录。您只限制用户界面而不限制系统