【问题标题】:Firebase Facebook auth: email verified always falseFirebase Facebook 身份验证:电子邮件验证总是错误的
【发布时间】:2016-07-15 14:23:30
【问题描述】:

正如标题中所说,无论我如何尝试登录 Facebook,emailVerified 字段始终为 false。这是设计使然吗?到目前为止,我已经阅读了整个 firebase 文档,似乎找不到任何关于此的信息。请确定:我尝试了 4 个不同的已验证帐户,结果始终相同。知道什么会导致这种行为吗?

【问题讨论】:

  • 代码片段在哪里?您也曾在 facebook 开发者上创建过应用程序吗?
  • 我真的不确定这里需要什么样的代码,身份验证工作正常,其他一切都很好,我得到了显示名称,照片网址,一切。只是 emailVerified 字段总是错误的。显然我已经创建了一个 Facebook 应用程序。

标签: firebase firebase-authentication


【解决方案1】:

Google 提供商电子邮件经过验证而 Facebook 电子邮件不经过验证的原因是因为 Google 被认为是受信任的提供商(您可以使用 Google 创建电子邮件帐户)。让我们再举一个例子。如果您使用 yahoo 设置电子邮件,您将收到一封电子邮件 myself@yahoo.com。如果您使用 yahoo OAuth 2.0 登录,您肯定知道该用户已通过验证,因为 Yahoo 是该电子邮件地址的实际所有者和颁发者。但是,您也可以使用相同的电子邮件创建 facebook 帐户或其他帐户,如 github 或 twitter,并使用您的电话号码或其他方式进行验证。在这种情况下,如果您使用 Facebook 登录,则不会验证电子邮件(Facebook 不拥有或管理该电子邮件地址)。通常,如果您希望在这种情况下验证电子邮件,则必须发送电子邮件验证(目前是实验性的,仅在 web 和 iOS 中可用,但最终应该会出现在 android 中)。

【讨论】:

  • 在这种情况下,文档应该清楚这一点。 AFAIK Facebook ONLY 如果已验证,则返回电子邮件,这意味着如果电子邮件存在,则该字段应为 true,如果电子邮件不存在,则该字段应为 false。至少这是我所期待的。
  • 我到处都能看到这个原因,但显然这在使用 Apple Sign In 登录时不算数。 Apple Sign In 返回的电子邮件始终在 Firebase 身份验证中被视为已验证。这种行为的原因是什么,因为在大多数情况下,Apple 也不是电子邮件地址的所有者或发行者。正如 Andrew 所说,如果 Facebook 用户仅使用电话号码进行验证,则 Facebook 不会返回电子邮件地址。
  • 是否有指向 Firebase 文档的链接,其中显示了哪些提供商经过默认电子邮件验证的矩阵?
  • 为以后发现此问题的任何人找到了此讨论回复:facebook 的电子邮件未验证github.com/firebase/firebase-js-sdk/issues/340
【解决方案2】:

自去年提出以来,我提供的解决方案可能对 OP 毫无用处,但希望对其他人有所帮助。虽然我同意 bojeil 的回答,但对于真实用户来说,在使用 Facebook 登录时验证他们的 Facebook 电子邮件地址有点烦人。

我今天在 Android 上遇到了这个问题,并从isEmailVerified() 开始应用了解决方法如果条件总是抛出 false 并将用户返回到登录页面,这是从我的代码中提取的解决方法:

FirebaseUser  mUser = mAuth.getCurrentUser();


        if(!mUser.getProviders().get(0).equals("facebook.com")) {

            if (mUser.isEmailVerified()) {

                Intent mainIntent = new Intent(getActivity(), MainActivity.class);
                mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                startActivity(mainIntent);


            } else {

                Snackbar.make(getView().findViewById(R.id.loginLayout), "Please verify your account!", Snackbar.LENGTH_LONG).show();

            }

        }else{

            Intent mainIntent = new Intent(getActivity(), MainActivity.class);
            mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(mainIntent);

        }

第一个 If 语句检查用户是否正在使用 Facebook 登录,如果是,则将用户带到 MainActivity,如果不是,则通常为电子邮件/密码用户和谷歌登录用户调用 isEmailVerified() 方法@987654324 @always 返回 true。

【讨论】:

    【解决方案3】:

    Firebase 提供了一个“验证”电子邮件地址的流程,但目前还没有适用于所有平台。此功能不适用于 Android...事实上,甚至无法查询电子邮件是否已使用 Android 代码验证(即使您使用 Web 或服务器代码执行验证)。

    “预期”的过程通常是:

    1. 验证用户的电子邮件(使用任何提供商)
    2. 调用 Firebase 函数发送电子邮件进行验证
    3. 通过设置验证检查来响应验证链接,使用客户端,查看电子邮件是否已通过验证(可能是几天 用户处理)
    4. 在验证电子邮件之前,禁止适当的
      代码中的函数(例如,链接不同的经过身份验证的
      供应商)

    如果您当前使用的是 Android 客户端,则无法启动第 2 步。

    【讨论】:

    • 我使用的是 web sdk,而不是 android。我知道电子邮件验证过程并且运行良好,但我不希望用户验证他们的电子邮件地址,而事实上它已经被 Facebook 验证了。如果我用 Google 测试身份验证,emailVerified 字段是true,所以它肯定在那里工作。我想知道为什么它不适用于 Facebook。
    • 因为我在 Facebook 注册时使用的电子邮件不属于他们。谷歌@andrew 并非如此
    猜你喜欢
    • 2018-02-10
    • 1970-01-01
    • 2023-03-18
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2017-01-25
    • 2018-09-17
    相关资源
    最近更新 更多