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

时间:2018-06-30 05:48:31

标签: firebase firebase-authentication firebaseui

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

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

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

    public class MainActivity extends AppCompatActivity {

    WebView webView;
    SwipeRefreshLayout swipeRefreshLayout;
    String currentUrl = "https://news.ycombinator.com/";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = (WebView) findViewById(R.id.webView);
        swipeRefreshLayout.setColorSchemeResources(R.color.login_bg);
        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);

        webView.loadUrl(currentUrl);
        webView.setWebViewClient(new MyWebViewClient());

        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                webView.loadUrl(currentUrl);
            }
        });


    }

    public class MyWebViewClient extends WebViewClient {

        @Override
        public void onPageFinished(WebView view, String url) {
            swipeRefreshLayout.setRefreshing(false);
            currentUrl = url;
            super.onPageFinished(view, url);
        }
    }

}

谢谢。

2 个答案:

答案 0 :(得分:2)

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

如果没有隐藏的最高机密选项(文档中没有提供),则这是不可能的。有一个recaptcha选项,但仅用于电话验证。因此,似乎您有2个选择。

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

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

答案 1 :(得分:1)

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

  1. 在注册页面上手动设置ReCaptcha(V2或V3)。请勿使用firebase. auth. RecaptchaVerifier,仅用于与电话身份验证集成。
  2. 在调用createUserWithEmailAndPassword之后,您需要立即调用自己的服务器,该服务器传递了Recaptcha令牌。这里有一个Firebase博客文章,介绍如何使用Firebase函数来实现该功能:https://firebase.googleblog.com/2017/08/guard-your-web-content-from-abuse-with.html。请注意,我认为Firebase记录了如何使用服务器端功能执行此操作,但并未将其与帐户创建直接集成,这有点奇怪。
  3. 最后一点是,在服务器端代码中,调用验证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)。如果重新验证失败,您还可以选择立即删除用户服务器端(使用admin API)。

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