谷歌登录失败com.google.android.gms.common.api.ApiException:10:

Hud*_*eld 38 android google-authentication firebase

所以我陷入了这个令人沮丧的问题.我对Firebase上的Google Auth很新,但我完成了firebase文档指示如何集成Google SignIn Auth的所有内容,但我仍然在控制台中收到这个奇怪的错误,包括两部分:

12-03 11:07:40.090 2574-3478/com.google.android.gms E/TokenRequestor: You have wrong OAuth2 related configurations, please check. Detailed error: UNREGISTERED_ON_API_CONSOLE
Run Code Online (Sandbox Code Playgroud)

并且

Google sign in failed com.google.android.gms.common.api.ApiException: 10:
Run Code Online (Sandbox Code Playgroud)

在任何人试图指出先前已经在堆栈溢出问题上提出的类似问题之前,这是我在看到所有可用解决方案之后到目前为止所做的事情,但是还没有解决错误

  • 我的项目有SHA1指纹
  • 我有我的OAuth 2.0客户端ID,android客户端ID和Web客户端,在requestIdToken()中我已经放了web客户端ID.
  • 我并没有公布谷歌Play商店我的项目的APK.这意味着我没有意外生成另一个SHA1指纹.
  • 我已逐步跟踪Google登录Auth firebase文档.

这是我的代码片段:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_signup);
    ButterKnife.bind(this);

    String webClientId = getString(R.string.web_client_id);


    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestIdToken(webClientId)
            .build();

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();

    mGoogleSignInClient = GoogleSignIn.getClient(this, gso);


    GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);


    googleLoginBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent signInIntent = mGoogleSignInClient.getSignInIntent();
            startActivityForResult(signInIntent, RC_SIGN_IN);
        }
    });

}



@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
    if (requestCode == RC_SIGN_IN) {
        // The Task returned from this call is always completed, no need to attach
        // a listener.
        Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);

        try{

            GoogleSignInAccount account = task.getResult(ApiException.class);
            firebaseAuthWithGoogle(account);

        } catch (ApiException e) {
            // Google Sign In failed, update UI appropriately
            Log.w(TAG, "Google sign in failed", e);
            // [START_EXCLUDE]
            Toast.makeText(this, "Gooogle Auth failed", Toast.LENGTH_LONG);
            // [END_EXCLUDE]
        }

    }
}



private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
    Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());
    // [START_EXCLUDE silent]
    //showProgressDialog();
    // [END_EXCLUDE]

    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithCredential:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        Toast.makeText(LoginActivity.this, "Successful Auth", Toast.LENGTH_LONG).show();
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        Toast.makeText(LoginActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        //updateUI(null);
                    }

                    // [START_EXCLUDE]
                    //hideProgressDialog();
                    // [END_EXCLUDE]
                }
            });
}
Run Code Online (Sandbox Code Playgroud)

Dil*_*lip 56

基本上问题是在SHA1控制台上放置的密钥请重新生成并重新放入相同的项目.

1)作为答案,请确保您的实际签名Android apk具有与SHA1您在Firebase项目的Android集成部分(您可以下载的页面google-services.json)的控制台中指定的指纹相同的指纹

2)最重要的是转到firebase项目的设置(左上角区域概述右侧的齿轮图标.然后切换到帐户链接选项卡.在该选项卡上将Google Play链接到您的项目.

  • 就我而言,Firebase 设置了“应用签名证书”和“上传证书”SHA-1 密钥。所以我在 Firebase 中有两个 SHA-1 密钥。我删除了与我的“上传证书”相同的那个,只保留了“应用签名证书”,这解决了我的问题。 (3认同)
  • 是“将Google Play链接到您的项目”为我完成的。谢谢!!! (3认同)
  • 令人惊讶的是,我在 firebase 控制台中添加了发布版本的 sha1,如果我通过移动到文件管理器直接安装发布版本,它运行良好。一旦我在 google play store 上发布了相同的发行版 apk,google sign in 就停止工作了。然后按照您的建议,我转到“帐户链接”选项卡并将 Google Play 链接到我的项目,然后它开始工作。 (2认同)

Chi*_*ani 11

在我的情况下,没有问题 SHA-1

我已经完成GoogleAuth使用Firebase.

我忘了添加 implementation 'com.firebaseui:firebase-ui-auth:4.3.1'

我把我自己的钥匙而不是R.string.default_web_client_id,所以这就是问题所在。我添加了上面的依赖项并替换R.string.default_web_client_id为我自己的密钥。

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();
Run Code Online (Sandbox Code Playgroud)

更新:2020 年 12 月 18 日

我们也可以使用 without requestIdTokenlike 下面。为此,您必须将 SHA1 添加到谷歌控制台。

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .build();
Run Code Online (Sandbox Code Playgroud)


Air*_*gle 9

我的解决方案有点不同,

经过几个小时的尝试各种事情。我找到了我的解决方案:

使用此处列出的步骤:https : //stackoverflow.com/a/34223470/10575896

  1. 打开安卓工作室
  2. 打开你的项目
  3. 单击 Gradle(从右侧面板,您将看到 Gradle Bar)
  4. 单击刷新(单击 Gradle Bar 中的 Refresh,您将看到列出项目的 Gradle 脚本)
  5. 单击您的项目(您的项目名称表单列表(根))
  6. 点击任务
  7. 点击安卓
  8. 双击签名报告(您将在运行栏中获得 SHA1 和 MD5(有时它会在 Gradle 控制台中))

控制台将打印出调试和发布的 SHA 密钥。过去某个时候我曾将调试键添加到 firebase,但我没有添加释放键。

我只是将 SHA1 和 SHA256 密钥添加到 firebase 中,我很高兴。


Gom*_* NL 6

我遇到了同样的问题,在检查了解决方案之后,从重新生成指纹到将Firebase上的应用程序链接到Google Play控制台并发布签名的apk,这个问题实际上是因为我在Windows上使用了SHA-1版本Firebase控制台。

  • 如果仍处于首次亮相模式,请使用debug.keystore SHA1
  • 仅在生产模式下才使用发行版SHA1

https://developer.android.com/studio/publish/app-signing.html


Aid*_*din 6

现在是 2022 年,我花了 7 个小时调试这个!我不是一个原生的 Android 开发者,所以直到现在我才知道这是什么。

这是我让它发挥作用的方法。

1)确保开发和产品之间的内部版本号不同!

您正在使用的世界中有 3 种不同的构建/应用程序:

  1. 您可以在 Google Play 商店中安装该版本。它有一个与之关联的内部版本号,无论是在 Play 商店还是在应用程序中 -> 点击并按住 -> 信息。
  2. Android Studio 版本中具有发布版本风格的版本
  3. Android Studio 构建中具有调试构建风格的版本

在此输入图像描述

一种debug是您可以附加调试器(错误图标!)的一种,另release一种是您不能附加的。

无论你做什么,都要确保它们是不同的,否则你就会抓狂,为什么它在这里起作用,在那里不起作用!

Android:标记 > 构建 > 发布 > 然后立即版本更新

我的背景是在发布之前我们就进行了标记和版本化。(例如后端) 在这里,如果你这样做,一切都会变得混乱!所以你应该标记,然后发布,然后立即版本升级!

理想情况下,Play 商店应该是1.1.7,发布版本应该是1.1.8(是的,提前一个版本,因为它是您要发布的版本),调试版本应该是1.1.8-debug

如果您不这样做,并且它们是相同的,Android 操作系统将缓存包/APK。因此,即使您从 Play 商店安装该应用程序,它也可能使用缓存中的 Android Studio 版本,并具有自己的证书!(我花了 4 个小时才明白为什么在两部手机上从 Play Store 安装相同的应用程序会产生不同的行为 - 其中一部使用的是 Android Studio USB 版本中的缓存 APK。)

2) 您需要至少 4 个来自 GCP 的不同 Oauth 客户端 ID 密钥!

此时,您应该意识到这个疯狂的系统,您应该为 Android 创建一个“Web”OAuth 客户端 ID,并且还创建一个虚拟 Android 客户端 ID!看到这个

是的,您需要一把“Web”密钥和一把“Android”密钥才能使 GoogleSignIn 正常工作。您应该几乎在任何地方都使用“Web”(除了进行服务器端令牌验证,您可以在其中验证 JWT 的受众/发行者)。无论如何,如果没有未使用的虚拟“Android”,它就无法工作。

然而,我不知道的是你需要 3 个 Android + 1 个 Web!

当您创建 Android OAuth 客户端 ID 时,它会要求提供 SHA-1。

在此输入图像描述

这 3 个应用程序中的每一个都有自己的证书,即 SHA-1。

如何获得 3 个 SHA-1?

对于 2 和 3(release以及debugAndroid Studio),您可以通过此解决方案从 gradle 获取它们。

在此输入图像描述

对于 Play 商店,您必须转至 Play 管理中心 > 应用程序完整性 > 应用程序签名,然后从那里获取“应用程序签名”证书。(上传的应该release最有可能与您的相符。)

在此输入图像描述

现在,继续创建这 3 个 Android Ouath 客户端 Id + 1 用于 Web,希望 Google SignIn 能够在任何地方使用!

在此输入图像描述


Ass*_* S. 5

使用Google PlayFirebase进行应用签名时,您需要将应用签名证书(可在Google Play控制台/版本管理/应用签名证书中找到)的SHA-1指纹添加到Firebase控制台/设置/ SHA证书指纹中

  • 这是放入其中的第三个 sha-1,它终于成功了!我首先仅进行了调试,然后添加了上传证书,最后添加了应用程序签名证书,这就成功了,谢谢! (3认同)
  • 非常感谢。它救了我。我快要恐慌了! (2认同)

Rav*_*iya 5

如果您在 firebase 中的所有配置都有效,例如 SHA-1 并且您导入了正确的 google-services.json 文件,您仍然收到错误,然后在 firebase 控制台中添加支持电子邮件

您必须在 Fire Base 控制台中添加支持电子邮件转到项目-> 设置 -> 常规 -> 公共设置添加支持电子邮件

  • +1 不知道为什么支持电子邮件会影响任何配置,但它会影响并设置电子邮件解决了`com.google.android.gms.common.api.ApiException: 12500: ` SIGN_IN_FAILED 错误 (2认同)