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

1mrurvl1  于 2023-04-22  发布在  其他
关注(0)|答案(4)|浏览(136)

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

我如何才能实现这一点?我希望拥有“www.example.com”的人xxxx@cat.com能够验证和查看 Jmeter 板数据

5cg8jx4n

5cg8jx4n1#

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

Firebase的Google Login是建立在普通的Google Logins之上的,并且有很多自动化功能。其中包括创建一个新的OAuth 2.0 Client in GCP的部分。这将被命名为Web client (auto created by Google Service)

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

如果您的公司使用Email & Password登录

最简单的方法是立即通过firebase后台auth triggeronCreate检查组织电子邮件,如Ben的回答中所述。如果帐户不属于您的组织-立即删除它。
这将 * 在很短的时间内 * 给予恶意用户访问您的系统。为了进一步保护,您可以将custom claim设置为您的组织用户(当他们在firebase函数中注册时)并确保每个对firestore/实时数据库的请求都检查了这些自定义声明。同样,您可以在调用数据库之前在firebase函数中检查自定义声明

oknwwptz

oknwwptz2#

**情况1:**用户已创建账号,您希望将一个云功能限制到特定邮箱。

您可以获取与云函数调用相关联的用户信息,并检查他们的电子邮件。如果他们有正确的电子邮件域,您可以调用外部数据库。您还应该做一些UI更改,以便用户不会在没有@cat.com的情况下收到错误。

**案例2:**限制Firebase项目中所有用户只能接收包含@cat.com的邮件?

如果是这样的话,你不能直接在firebase认证中限制电子邮件,所以你必须在云函数后面粘贴用户注册代码,在那里创建用户帐户。
您可以在云函数中使用Firebase Admin SDK来完成此操作。docs

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

客户端将调用云函数与他们所需的电子邮件和密码,并在调用此.createUser,你可以检查正确的电子邮件,然后再创建用户与"dog@cat.com".toLowerCase().endsWith("cat.com")
或者,您可以为用户设置自定义声明,如@frunkad所述:为使用“@ www.example.com”电子邮件注册的用户给予额外权限cat.com,如下所示:在用户创建时通过Firebase Functions定义角色。但是,在OP的情况下,只有具有“@cat.com”的用户才能注册,因此自定义声明会使问题过于复杂。
此外,使用电子邮件域作为访问控制的一种形式听起来不是一个好主意。在帐户创建过程中,您根据电子邮件手动添加对用户文档的访问权限。当您想给予某人一封电子邮件,但不想给他们数据库的访问权限时,会发生什么?

syqv5f0l

syqv5f0l3#

在你的firebase安全规则中粘贴这个
这对我很有效,我可以限制登录谷歌用户到我的组织域

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

tnkciper4#

从2022年8月起,您可以编写blocking functions,如果不满足某些要求,可以阻止用户创建帐户。链接的文档具体显示了这个示例:

export const beforecreated = beforeUserCreated((event) => {
  const user = event.data;
  // (If the user is authenticating within a tenant context, the tenant ID can be determined from
  // user.tenantId or from event.resource, e.g. 'projects/project-id/tenant/tenant-id-1')

  // Only users of a specific domain can sign up.
  if (user?.email?.includes('@acme.com')) {
    throw new HttpsError('invalid-argument', "Unauthorized email");
  }
});

要使用阻止函数,您需要使用Firebase Authentication with Identity Platform。

相关问题