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

94

所以我被这个令人沮丧的问题困住了。 我在Firebase上使用Google身份验证还比较新,但我已经按照Firebase文档中有关如何集成Google SignIn身份验证的说明完成了所有步骤,但是我仍然在控制台中收到这个由两部分组成的奇怪错误:

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

并且

Google sign in failed com.google.android.gms.common.api.ApiException: 10:

在任何人试图指出以前在stackoverflow 上已经被问过的类似问题之前,这是我迄今为止所做的工作,在看到所有可用的解决方案之后,没有一个解决了错误。

  • 我有我的项目的SHA1指纹
  • 我有我的OAuth 2.0客户端ID,包括android客户端ID和Web客户端ID,并且在requestIdToken()中,我放置了Web客户端ID
  • 没有发布我的项目APK在Google Play商店上。这意味着我没有意外地生成另一个SHA1指纹。
  • 我按照Google登录认证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]
                }
            });
}

2
问题基本上在于控制台中放置的SHA1密钥,请重新生成并正确地放置在同一项目中。 - Dilip
3
是的,显然你非常有帮助!重新生成我的SHA1指纹解决了问题。谢谢。但是我还是很好奇,如果Firebase一开始就生成了指纹,为什么会有指纹问题?而且自那时以来我也没有进行修改吗? - Hudi Ilfeld
你采用了哪个解决方案来修复这个问题? - hasan_shaikh
@hasan_shaikh 被接受的人 - Hudi Ilfeld
疯了,但在Google开发者控制台创建新的Android OAuth后,应用程序仍然返回ApiException 10。删除应用程序并安装新的应用程序可以解决我的问题。 - Dmytro Batyuk
显示剩余2条评论
28个回答

117

问题基本上出在控制台上放置的 SHA1 密钥,请重新生成并正确地将其放置到同一项目中。

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

更多信息请参见:为 Flutter 应用程序生成 SHA-1

2) 此外,转到 Firebase 项目的设置(概览右上角的齿轮图标),然后切换到“帐户链接”选项卡。在该选项卡上,将 Google Play 链接到您的项目。

编辑: 帐户链接选项卡不再存在,改为:

  1. 登录 Firebase。
  2. 点击设置图标,然后选择项目设置。
  3. 点击集成选项卡。
  4. 在 Google Play 卡片上,点击 链接

输入图像描述


3
在我的情况下,Firebase 设置了“应用签名证书”和我“上传证书”的 SHA-1 密钥。因此,我的 Firebase 中有两个 SHA-1 密钥。我删除了与我的“上传证书”相同的那个密钥,只保留了“应用签名证书”,这解决了我的问题。 - jesobremonte
2
令人惊讶的是,我在 Firebase 控制台中添加了发布版本的 SHA1,如果我直接通过文件管理器安装发布版本,则它可以正常工作。但是,一旦我将相同的发布 APK 发布到 Google Play 商店,Google 登录就停止工作了。然后,按照您的建议,我转到“帐户链接”选项卡,并将 Google Play 链接到我的项目,然后它开始正常工作了。 - jatin rana
1
我尝试了所有的方法,但仍然遇到这个问题。这可能与我从Ionic转移到Flutter有关吗?我也复制了相同的密钥库,但我认为这不应该是一个问题,对吧?不知道还有什么别的方法可以尝试。 - Dani
@dilip 我也遇到了同样的问题。我已经将由Play控制台生成的SH256添加到Firebase帐户中。你能帮忙解决吗? - hasan_shaikh
1
将我的项目链接到Google Play为我解决了一个持久而令人困惑的问题。非常感谢! - lwilber
显示剩余3条评论

33

使用 Google Play App签名Firebase 时,需要将应用程序签名证书的 SHA-1 指纹(可在 Google Play 控制台/ 发布管理/ 应用签名证书中找到)添加到 Firebase 控制台/ 设置/ SHA证书指纹中。

SHA 位置更新为:Google Play 控制台 > 发布 > 设置 > 应用完整性


3
非常感谢。 它救了我,我快要惊慌失措了! - Sudarshan
3
这是第三个要添加的SHA-1,终于成功了!我开始只有调试版,然后加了上传证书,最后加上应用签名证书就成功了。谢谢! - Kevin
@Kevin,所以你最终在Firebase控制台中使用了添加四个SHA-1指纹吗?你使用了哪个客户端ID对应于SHA-1指纹? - J0nathan Lam
1
原来上传证书的 SHA-1 和发布的 SHA-1 是相同的。因此,我已经在我的 Firebase 控制台中添加了三个 SHA-1(发布、调试和应用签名证书)。你使用了哪个客户端 ID?因为我仍然遇到异常 10 错误。 - J0nathan Lam
伙计...终于在20多个小时后找到了这个,不然还不知道怎么办,谢谢。 - Merthan Erdem
对每个开发人员来说,这似乎是一场马拉松比赛!我的份额是7小时的调试,我在这里写了关于3个SHA-1的内容:https://dev59.com/uFYN5IYBdhLWcg3wT2xa#72440651 - Aidin

18

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

我使用Firebase做了GoogleAuth

我忘记添加 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();

更新:2020年12月18日

我们也可以像下面这样不使用 requestIdToken。但是,这需要您将SHA1添加到Google控制台中。

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

非常感谢,这对我有用,为什么没有文档记录呢?我从 Google 的所有官方文档中阅读,甚至没有提到导入 firebase-ui-auth 或 R.string.default_web_client_id。 - BananyaDev
不知道,但我遇到了这个问题,并花了太多时间解决它。最终我自己解决了这个问题。 - Chirag Savsani

15

我遇到了同样的问题,经过寻找解决方案,尝试了重新生成指纹、将应用程序连接到 Firebase 并发布已签名的 APK 等步骤之后,问题实际上是因为我在 Firebase 控制台上使用了发行版 SHA-1。

  • 如果您仍处于调试模式,请使用 debug.keystore 的 SHA1
  • 只有在生产模式下才使用 release SHA1

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


这是重要的。 - Miguel Tomás
我刚刚修复了同样的错误。 - cgb_pandey
是的,有3个SHA-1!https://dev59.com/uFYN5IYBdhLWcg3wT2xa#72440651 - Aidin

9

我的解决方案有点不同:

经过几个小时的尝试,我找到了解决方案:

按照这里列出的步骤:

https://dev59.com/CF4c5IYBdhLWcg3wuMR7#34223470
  1. 打开Android Studio
  2. 打开您的项目
  3. 单击Gradle(从右侧面板,您将看到Gradle栏)
  4. 单击刷新(从Gradle栏单击刷新,您将看到您的项目的Gradle脚本列表)
  5. 单击您的项目(从列表(根)中选择您的项目名称)
  6. 单击任务
  7. 单击Android
  8. 双击签名报告(您将在运行栏中获得SHA1和MD5(有时会在Gradle控制台中))

控制台将打印出调试版和发布版的SHA密钥。 我曾经添加过调试密钥到Firebase,但我没有添加发布密钥。

我只需将SHA1和SHA256密钥添加到Firebase即可。


专门针对React Native项目 https://app.box.com/s/vf9ez8h8u9ran38ltk5hyupmuwq8bw3l - Chirag Purohit
现在是2022年,你想要的SHA1已经不在gradle中了。实际上,它在Play Console本身中。请参见https://dev59.com/uFYN5IYBdhLWcg3wT2xa#72440651。 - Aidin

6
2022年了,我花了7个小时来调试它!我不是本地的Android开发者,所以直到现在我都不知道怎么回事。
以下是我让它正常工作的方法。

1)确保你的开发版和生产版有不同的构建编号!

世界上有三种不同的构建/应用程序可供您使用:

  1. 您可以安装的Google Play商店中的应用程序。它有一个与之相关的构建号,既在Play商店中,也在应用程序->点击并按住->信息 中。
  2. 在Android Studio中构建的具有发布构建风格的应用程序。
  3. 在Android Studio中构建的具有调试构建风格的应用程序。

enter image description here

debug 是可以附加调试器(错误图标!)的版本,而 release 则不行。

无论你做什么,一定要确保这两个版本是不同的,否则你会为它在这里能运行而在那里不能运行而抓狂!

Android:标记 > 构建 > 发布 > 立即版本升级

我来自一个标记和版本在发布之前进行的背景下。(例如后端) 在这里,如果你这样做了,它会搞乱一切!因此,你应该先标记,然后发布,然后立即进行版本升级!

理想情况下,Play 商店应该是 1.1.7,发布版本应该是 1.1.8(是的,比 Play 商店的版本高一个版本,因为你将要发布的就是这个版本),而 debug 版本应该是 1.1.8-debug

如果您不这样做,且它们是相同的,Android操作系统将缓存软件包/APK。因此,即使您从Play Store安装应用程序,它可能会使用它在缓存中拥有的Android Studio版本,以及其自己的证书!(这让我不知道为什么在两部手机上从Play Store安装相同的应用程序产生了不同的行为,花了我4个小时。其中一个正在使用来自Android Studio USB构建的缓存APK文件。)
2) 您需要至少4个不同的GCP OAuth客户端ID密钥!
此时,您应该意识到一个疯狂的系统,即您需要为Android创建一个“Web”OAuth客户端ID,还需要一个虚拟的Android客户端ID!请参见 this
是的,您需要一个“Web”密钥和一个“Android”密钥才能使Google登录正常工作。您几乎可以在任何地方使用“Web”密钥(除了进行服务器端令牌验证,在那里您验证JWT的受众/发行者)。无论如何,如果没有未使用的虚拟“Android”密钥,它就无法工作。
然而,我不知道的部分是你需要3个Android + 1个Web!

当你创建一个Android OAuth客户端ID时,它会要求输入SHA-1。

enter image description here

每个应用程序都有自己的证书,也就是SHA-1。如何获取三个SHA-1? 对于2和3(Android Studio的发布版和调试版),您可以通过Gradle从this solution获得它们。

enter image description here

对于Play Store,您需要前往Play控制台>应用完整性>应用签名,并从那里获取“应用签名”证书。(上传证书应该与您的发布证书最匹配。)

enter image description here

现在,请创建这3个Android Ouath客户端ID + 1个Web客户端ID,希望Google登录在任何地方都能正常工作!

enter image description here


1
2023年了,我被你的回答救了。添加第三个凭证起作用了。这是谁做的? - SkyPunch

5
如果你在Firebase中拥有所有配置(例如SHA-1),并且已正确导入google-services.json文件,但仍然出现错误,那么请在Firebase控制台中添加支持电子邮件。
你需要在Firebase控制台中添加支持电子邮件。 转到项目->设置->常规->公共设置->添加支持电子邮件。

2
+1 不知道为什么支持电子邮件会影响任何配置,但它确实会影响,并设置电子邮件解决了“com.google.android.gms.common.api.ApiException: 12500:SIGN_IN_FAILED”错误。 - John
这是唯一的答案。谢谢。 - Lexy Feito

3
我为这个问题纠结了两天!问题出在我使用的clientId是Android类型,而我需要使用Web应用程序类型的ClientId。如果你遇到同样的问题,请注意这一点 ;)

3
  1. 当你 Build GoogleSignInOptions 时,请使用 .requestIdToken(getString(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();

请按照以下步骤将您的debug.keystore的SHA1和SHA256指纹添加到Firebase项目中:
1. 获取debug.keystore的指纹:Linux/Mac - keytool -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore,Windows - keytool -list -v -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore 2. 在Firebase项目的Android应用程序部分中添加这些指纹:https://support.google.com/firebase/answer/9137403?hl=en

2
在添加了SHA1和SHA256应用签名证书后,仍然无法正常工作。一旦我添加了SHA1应用上传证书,它就可以正常工作 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接