Firebase Auth on Web - 如何为电子邮件/密码登录添加垃圾邮件保护

Posted

技术标签:

【中文标题】Firebase Auth on Web - 如何为电子邮件/密码登录添加垃圾邮件保护【英文标题】:Firebase Auth on Web - How to add spam protection for email/password login 【发布时间】:2018-12-09 06:15:48 【问题描述】:

对于我的网站,我想使用 Firebase 身份验证而不是使用 FirebaseUI Web 来构建自己的登录表单,用于基于电子邮件/密码的身份验证。我将使用 createUserWithEmailAndPassword JS 函数来创建新的用户帐户。但是如何防止垃圾邮件注册?通常对于基于网络的表单,我会使用 Google Recaptcha 并在我的服务器上验证 recaptcha。但是在这里,我没有使用我的服务器来创建用户帐户。我正在客户端调用以创建用户帐户。

当然,我将在流程中使用电子邮件验证,但我如何防止机器人首先创建帐户?

我也了解 Firebase 对来自单个 IP 的每分钟请求数有某种限制,但我想更进一步并尝试阻止这些注册。

firebase.auth().createUserWithEmailAndPassword(email, password).catch(function(error) 
  // Handle Errors here.
  var errorCode = error.code;
  var errorMessage = error.message;
  // ...
);

谢谢。

【问题讨论】:

【参考方案1】:

2年后,这个问题仍然有效,据我所知,这是不可能的。您可能不再需要这个问题的答案,但它可能对其他人有所帮助。即使您成功地手动完成了某些操作,这些 js 函数也会保留在那里,并且可以由任何知道如何操作的用户手动调用。

如果文档中没有隐藏的绝密选项,则这是不可能的。有一个 recaptcha 选项,但它仅用于电话身份验证。因此,您似乎有两个选择。

    忽略并删除未验证其电子邮件地址的用户。

    从 Firebase 控制台禁用电子邮件选项并实现您自己的 电子邮件身份验证。生成您自己的令牌并将用户登录 Firebase 与该自定义令牌。 https://firebase.google.com/docs/auth/web/custom-auth

【讨论】:

【参考方案2】:

我正在跟进弗兰克什的回答。他是完全正确的,我同意我认为 Firebase 在进行电话身份验证时(现在在进行电话 MFA 时)自动集成 ReCaptcha 很奇怪,但在 createUserWithEmailAndPassword 中不提供通过 recaptcha 验证程序的支持。因此,真正解决此问题的唯一方法是执行以下操作:

    在您的注册页面上手动设置 ReCaptcha(V2 或 V3)。不要使用firebase. auth. RecaptchaVerifier,它仅用于与电话身份验证集成。 在调用createUserWithEmailAndPassword 后,您需要立即调用您自己的服务器以传递recaptcha 令牌。这里有一篇 Firebase 博客文章,介绍了如何使用 Firebase 函数:https://firebase.googleblog.com/2017/08/guard-your-web-content-from-abuse-with.html。请注意,我认为 Firebase 记录了如何使用服务器端功能执行此操作但没有直接将其与帐户创建集成,这有点奇怪。 最后一点是,在您的服务器端代码中,在您调用验证 recaptcha 令牌后,您需要使用 Firebase Admin API 为 Firebase 用户设置自定义声明。该声明可能类似于recaptchaPassed: true(或错误)。有关自定义声明的详细信息,请参阅https://firebase.google.com/docs/auth/admin/custom-claims。

之后,您可以根据该自定义声明的价值进行操作。例如,您可以在其他服务器端调用中读取该自定义声明,或者您可以在 Firestore 安全规则中使用它(关于此的好博文,https://medium.com/google-developers/controlling-data-access-using-firebase-auth-custom-claims-88b3c2c9352a)。如果重新验证失败,您还可以选择立即删除用户服务器端(使用管理 API)。

请注意,在客户端上的代码调用createUserWithEmailAndPassword 之后,并不能保证某些恶意脚本会调用您的服务器端令牌验证函数,了解这一点很重要。因此,您的其余代码可以保证特定 Firebase 用户通过 recaptcha 验证的唯一方法是查找您在用户服务器端设置的自定义声明。

【讨论】:

以上是关于Firebase Auth on Web - 如何为电子邮件/密码登录添加垃圾邮件保护的主要内容,如果未能解决你的问题,请参考以下文章

Flutter + Firebase Auth:有啥方法可以在 Web 上使用 Firebase 电话身份验证重新发送短信验证码?

Flutter Web 将 Firebase Auth 传递给 HTML

TypeError: _app.default.auth 不是一个函数 - React Native Web - Firebase

Firebase Web Auth 在移动设备上不起作用?

Firebase Auth 与 firebaseui-web 在身份验证后不会重定向

页面授权过滤器 - Flutter Web/Firebase Auth