如何在 Firebase 身份验证中限制电子邮件域

Voi*_*d95 3 firebase firebase-authentication firebase-realtime-database google-cloud-functions

我有一个关于 Firebase 身份验证的问题。实际上,我正在为我的公司制作一个仪表板,并将它托管在 firebase 中。我想将电子邮件身份验证仅限于我的公司域(例如:cat.com)。但是我浏览了 stackoverflow 的答案,发现我可以在数据库中施加规则。但问题是我将使用 Firebase 函数调用外部数据库来获取数据并将其提供给网站(仪表板)。所以没有特定于域的规则将适用于那里。下面是我的仪表板架构的概要

在此处输入图片说明

我怎样才能做到这一点?我希望拥有“xxxx@cat.com”的人能够验证和查看仪表板数据

fru*_*kad 12

如果您的公司使用 GSuite 并通过“使用 Google 登录”登录

Firebase 的 Google 登录建立在普通的 Google 登录+大量自动化之上。其中包括在 GCP 中创建新的OAuth 2.0 客户端的部分。这将被命名Web client (auto created by Google Service)

网络客户端

此客户端自动链接到OAuth 同意屏幕,您可以在其中提及您的应用程序的显示名称,并将其限制为您组织中拥有 Google 帐户的用户

在此处输入图片说明

如果您的公司使用电子邮件和密码登录

最简单的方法是立即通过本的回答中提到的firebase 后台身份验证触发器 立即检查组织电子邮件onCreate。如果该帐户不属于您的组织 - 立即将其删除。

这将暂时允许恶意用户访问您的系统。为了进一步保护,您可以为您的组织用户设置自定义声明(当他们注册时 - 在 firebase 功能中)并确保对 firestore/实时数据库的每个请求都检查了这些自定义声明。同样,您可以在调用数据库之前检查 firebase 函数中的自定义声明

  • “Ben 的回答中提到了后台身份验证触发 onCreate”。我的意思实际上是在我的答案中使用 HTTP 云函数。为此目的而进行的身份验证触发器(在创建时立即删除用户)将导致将来发生**灾难**。如果由于某种原因删除失败(并非所有http请求都成功)怎么办?用户将拥有永久的完全访问权限,因为触发器仅在删除和创建时发生。您可能会说,任何事情都可能会像这样失败,但这种失败比 HTTP 云函数根本不运行要糟糕得多:最坏的情况是用户返回 500 并且没有获取任何数据。 (2认同)

Him*_*der 9

在您的 Firebase 安全规则中只需粘贴此内容

这对我有用,我可以将登录的 Google 用户限制在我的组织域中

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.token.email.matches('.*@domain[.]com');
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Ben*_*rth 6

案例 1:用户已经创建了他们的帐户,并且您希望将一项云功能限制为特定的电子邮件地址。

您可以获取与云函数调用关联的用户信息,并查看他们的电子邮件。如果外部数据库具有正确的电子邮件域,则您可以调用它们。您还应该进行一些 UI 更改,以便用户在没有@cat.com.


案例 2:将 Firebase 项目中的所有用户限制为包含@cat.com?

如果是这样,您不能直接在 firebase 身份验证中限制电子邮件,因此您必须将用户注册代码粘贴在云功能后面,在那里创建用户帐户。然后,您可以在他们尝试注册时查看他们的电子邮件。

您可以在云函数中使用 Firebase Admin SDK 执行此操作。文档

admin.auth().createUser({
  email: 'user@example.com',
  emailVerified: false,
  phoneNumber: '+11234567890',
  password: 'secretPassword',
  displayName: 'John Doe',
  photoURL: 'http://www.example.com/12345678/photo.png',
  disabled: false
})
  .then(function(userRecord) {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully created new user:', userRecord.uid);
  })
  .catch(function(error) {
    console.log('Error creating new user:', error);
  });
Run Code Online (Sandbox Code Playgroud)

客户端将使用他们想要的电子邮件和密码调用云功能,在调用此之前.createUser,您可以在创建用户之前检查正确的电子邮件"dog@cat.com".toLowerCase().endsWith("cat.com")


或者,您可以为@frunkad 提到的用户设置自定义声明:向使用“@cat.com”电子邮件注册的用户授予额外权限,如下所示:在用户创建时通过 Firebase 函数定义角色。但是,在 OP 的情况下,只有具有“@cat.com”的用户才能注册,因此自定义声明使问题过于复杂。

此外,使用电子邮件域作为访问控制的一种形式听起来也不是一个好主意。在帐户创建过程中,您可以根据电子邮件手动添加对用户文档的访问权限。当您想给某人发送电子邮件但不想让他们访问数据库时会发生什么?