Firebase 身份验证电子邮件提供商仅允许创建新帐户

问题描述 投票:0回答:1

我有两个 Firebase 项目,它们都使用来自 Android 和 iOS 的 Firebase 身份验证。在一个项目中,身份验证工作正常且符合预期。

在这个麻烦的项目中,Firebase 身份验证不适用于已出现在 Firebase 控制台中的任何现有用户。对于这些用户,FirebaseUI 不正确地显示创建新帐户的屏幕,然后如果您继续执行此操作,UI 会显示“电子邮件帐户注册失败”,并且 Android 日志中会出现以下错误。帐户创建不成功这一事实并不令人意外,因为该用户已经存在。真正的问题是 Firebase Auth UI 不应为现有用户显示帐户创建屏幕。显示帐户创建屏幕时,日志中没有显示错误。

或者,如果您使用唯一的电子邮件创建一个全新的帐户,一切都会按预期进行。但是,如果您出去并使用此帐户返回,我会收到与上述相同的错误序列。

这些项目之间的 Android 代码是相同的——唯一不同的是 google-services.json 将其链接到两个 Firebase 帐户之一。在这两个 iOS 应用程序上,有问题的 Firebase 帐户存在相同的症状。我尝试过删除并重新添加电子邮件提供商,但这没有什么区别。

有问题的 Firebase 帐户可能出现什么问题?

2023-11-13 09:48:46.407 14512-14512/net.llamadigital.safetyonsite2 W/EmailProviderResponseHa: No providers known for user (<redacted>[email protected]) this email address may be reserved.
2023-11-13 09:48:46.416 14512-14512/net.llamadigital.safetyonsite2 E/AuthUI: A sign-in error occurred.
    com.firebase.ui.auth.FirebaseUiException: Unknown error
        at com.firebase.ui.auth.viewmodel.email.EmailProviderResponseHandler$StartWelcomeBackFlow.onSuccess(EmailProviderResponseHandler.java:111)
        at com.firebase.ui.auth.viewmodel.email.EmailProviderResponseHandler$StartWelcomeBackFlow.onSuccess(EmailProviderResponseHandler.java:98)
        at com.google.android.gms.tasks.zzm.run(com.google.android.gms:play-services-tasks@@18.0.2:1)
        at android.os.Handler.handleCallback(Handler.java:958)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loopOnce(Looper.java:205)
        at android.os.Looper.loop(Looper.java:294)
        at android.app.ActivityThread.main(ActivityThread.java:8171)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)

这是用于启动登录的代码。

        // Choose authentication providers
        List<AuthUI.IdpConfig> providers = Arrays.asList(
                new AuthUI.IdpConfig.EmailBuilder().build());


        // You must provide a custom layout XML resource and configure at least one
        // provider button ID. It's important that that you set the button ID for every provider
        // that you have enabled.
        AuthMethodPickerLayout customLayout = new AuthMethodPickerLayout
                .Builder(R.layout.layout_login)
                .setEmailButtonId(R.id.emailButton)
                .build();

        // Create and launch sign-in intent
        Intent signInIntent = AuthUI.getInstance()
                .createSignInIntentBuilder()
                .setAuthMethodPickerLayout(customLayout)
                .setAvailableProviders(providers)
                .setTheme(R.style.Theme_SOS)
                .build();
        signInLauncher.launch(signInIntent);

android firebase firebase-authentication firebaseui
1个回答
0
投票

如果您想仅通过电子邮件选项使用 Firebase 身份验证,您必须首先在 Firebase 控制台中启用 Google 身份验证。即使您无意使用 Google 身份验证,也是如此。

如果您未能执行此操作,则 Firebase 控制台将不会设置电子邮件身份验证所需的 OAuth 密钥,并且您将出现我的问题中描述的症状。您可以从 Android google-services.json 文件中判断这是否是问题,因为“oauth_client”值将是一个空数组 [] 或者只有一个带有“client_type”的条目: 1. 在我的情况下,正确的“ oauth_client”值有多个条目,如下所示:

      "oauth_client": [
        {
          "client_id": "<redacted>.apps.googleusercontent.com",
          "client_type": 1,
          "android_info": {
            "package_name": "your.app.package.name",
            "certificate_hash": "<redacted>"
          }
        },
        {
          "client_id": "<redacted>.apps.googleusercontent.com",
          "client_type": 3
        }
      ],

您实际上不必使用此 Google 身份验证。可以在应用程序代码中禁用它,如我的问题中的代码片段所示,它仅启用电子邮件身份验证。但同样,在下载 .json 或 .plist 之前,必须在控制台中启用 Google 身份验证选项

我在第一个 Firebase 帐户中没有遇到此问题的原因是因为我在开发过程中确实启用了 Google 身份验证,因此一切正常。当我转移到生产 Firebase 帐户后,我从未设置 Google 身份验证,因为我不希望启用它。我没有意识到 在 Firebase 控制台中设置 Google 身份验证是电子邮件身份验证正常运行的一项未记录的要求。

© www.soinside.com 2019 - 2024. All rights reserved.