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

Posted

技术标签:

【中文标题】谷歌登录失败 com.google.android.gms.common.api.ApiException: 10:【英文标题】:Google sign in failed com.google.android.gms.common.api.ApiException: 10: 【发布时间】:2018-05-17 02:01:16 【问题描述】:

所以我被这个令人沮丧的问题所困扰。 我对 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

还有

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

在任何人试图指出以前在堆栈溢出时被问过的类似问题之前,这是我在看到所有可用的解决方案但尚未解决错误之后到目前为止所做的事情

我的项目有我的 SHA1 指纹 我有我的 OAuth 2.0 客户端 ID,包括 android 客户端 ID 和 Web 客户端,并且在 requestIdToken() 中我放置了 Web 客户端 ID。 我确实没有在 google play store 上发布我的项目的 APK。这意味着我没有意外生成另一个 SHA1 指纹。 我已逐步按照 Google 登录身份验证 firebase 文档进行操作。

这是我的代码 sn-p:

@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]
                
            );

【问题讨论】:

基本上问题出在控制台上的 SHA1 密钥中,请重新生成它并再次正确放置相同的项目 是的,显然你帮了大忙!重新生成我的 SHA1 指纹解决了这个问题。谢谢。但是,我仍然很好奇,如果firebase首先生成指纹,为什么会出现问题。从那以后我就没有修改过?? 您采用了哪种解决方案来解决问题 @hasan_shaikh 被接受了 这很疯狂,但在谷​​歌开发者控制台应用程序中创建新的 android OAuth 后继续返回 ApiException 10。删除应用程序并停止新应用程序为我解决了这个问题 【参考方案1】:

基本上问题出在控制台上的SHA1 键中,请重新生成它并再次正确放置相同的项目。

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

欲了解更多信息,请参阅:Generate SHA-1 for Flutter app

2) 最重要的是,转到您的 Firebase 项目的设置(齿轮图标位于左上角的概览右侧。然后切换到帐户链接标签。在该标签上,将 Google Play 链接到您的项目。

编辑: Account Linking 标签不再存在,而是:

    登录 Firebase。 点击设置图标,然后选择项目设置。 单击“集成”选项卡。 在 Google Play 卡上,点击Link

【讨论】:

在我的例子中,Firebase 同时设置了“应用程序签名证书”和我的“上传证书”SHA-1 密钥。所以我在 Firebase 中有两个 SHA-1 密钥。我删除了与我的“上传证书”相同的那个,只保留了“应用签名证书”,这解决了我的问题。 令人惊讶的是,我在 firebase 控制台中添加了发布版本的 sha1,如果我通过移动到文件管理器直接安装发布版本,它工作得很好。一旦我在 google play store 上发布了相同的发布 apk,google 登录停止工作。然后按照您的建议,我转到帐户链接选项卡并将 Google Play 链接到我的项目,然后它开始工作。 我在尝试了一切之后遇到了这个问题。可能与我从 Ionic 转到 Flutter 有关吗?我也复制了相同的密钥库,但我认为这应该不是问题,对吧?不知道还能尝试什么 @dilip 我也面临同样的问题。我已将游戏控制台生成的 SH256 添加到 firebase 帐户。你能帮忙吗? 将我的项目链接到 Google Play 为我解决了一个长期存在且令人困惑的问题。非常感谢!【参考方案2】:

使用 App Signing by Google PlayFirebase 时,您需要添加 App 签名证书 的 SHA-1 指纹(找到在 Google Play 控制台/发布管理/应用签名证书上)到 Firebase 控制台/设置/SHA 证书指纹

SHA 的更新位置:Google Play Console &gt; Release &gt; Setup &gt; App integrity

【讨论】:

非常感谢。它救了我。我要恐慌了! 这是第三个放入其中的 sha-1,它终于成功了!我首先只有调试,然后我添加了上传证书,最后是应用程序签名证书,这成功了,谢谢! @Kevin 那么,您最终使用了向 Firebase 控制台添加四个 SHA-1 指纹吗?您使用的哪个客户端 ID 对应于 SHA-1 指纹? 原来上传证书SHA-1和release SHA-1是一样的。所以,我在我的 firebase 控制台中添加了三个 SHA-1(发布、调试、应用签名证书)您使用了哪个客户端 ID?因为我仍然收到异常 10 错误。 老兄......在 20 多个小时没有弄清楚之后终于找到了这个,谢谢。【参考方案3】:

就我而言,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。 不知道,但我遇到了这个问题,并且在这个问题上花费了太多时间。我自己解决了这个问题。【参考方案4】:

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

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

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

【讨论】:

这个很重要【参考方案5】:

我的解决方案有点不同,

经过数小时的尝试。我找到了解决方案:

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

    打开 Android Studio 打开您的项目 点击 Gradle(从右侧面板,您将看到 Gradle 栏) 点击 Refresh(从 Gradle Bar 中点击 Refresh,您将看到 List Gradle 脚本) 单击您的项目(您的项目名称表单列表(根)) 点击任务 点击安卓 双击签名报告(您将在运行栏中获得 SHA1 和 MD5(有时会在 Gradle 控制台中))

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

我只是将 SHA1 和 SHA256 密钥添加到 firebase,然后就可以开始了。

【讨论】:

专为 React Native 项目 app.box.com/s/vf9ez8h8u9ran38ltk5hyupmuwq8bw3l【参考方案6】:

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

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

【讨论】:

+1 不知道为什么支持电子邮件会影响任何配置,但确实会影响并且设置电子邮件解决了com.google.android.gms.common.api.ApiException: 12500: SIGN_IN_FAILED 错误 这是唯一的答案。谢谢。【参考方案7】:

各位,请确保您已在 android studio SDK Manager 中安装了 google play services。完成后,重建统一项目——一切正常。

【讨论】:

【参考方案8】:

我处理这个问题 2 天! 问题是我使用的 clientId 是 android 类型,而我必须使用 web 应用程序类型 Clientid 。如果你有同样的问题,请考虑这个;)

【讨论】:

【参考方案9】:

我对每个答案都有问题,所以这是对我有用的解决方案:

首先,将 Firebase 添加到您的项目中:

转到 Firebase 网站 -> 添加项目 -> 创建新项目后,转到 添加应用程序 并添加您的 Android 应用程序

注意添加确切的包名称并调试 SHA-1 密钥。

您可以在 Android Studio 中生成调试 SHA-1 密钥:

在右侧打开 Gradle 面板 -> 转到 Tasks -> android -> 运行 signingReport

您的 SHA-1 密钥将显示在运行窗口中

注册应用后,下载配置文件。在配置 .json 文件中,您可以找到您的 client_idclient -> oauth_client -> client_id

注意有两个 client_id"client_type": 3 使用以下代码为我工作:

private fun requestSignIn(context: Context) 

    GoogleSignIn.getLastSignedInAccount(context)?.also  account ->
        onSignedIn(account)
        return
    

    val signInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestScopes(Scope("https://www.googleapis.com/auth/spreadsheets"))
        .requestEmail()
        .requestIdToken("client_id_goes_here")
        .build()
    val client = GoogleSignIn.getClient(context, signInOptions)

    startActivityForResult(client.signInIntent, REQUEST_SIGN_IN)

然后在onActivityResult中:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == REQUEST_SIGN_IN) 
         if( resultCode == RESULT_OK) 
            GoogleSignIn.getSignedInAccountFromIntent(data)
                .addOnSuccessListener  account ->
                    onSignedIn(account)
                
                .addOnFailureListener  e ->
                    Log.d("Fail", "Fail")
                
          
    

onSignedIn 中,您应该调用 google sheet api

【讨论】:

【参考方案10】:
    让你在BuildGoogleSignInOptions时使用.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 项目: 获取 debug.keystore 的指纹:Linux/Mac - keytool -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore,Windows - keytool -list -v -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore 将这些指纹添加到您的 Firebases 项目的 Android 应用部分:https://support.google.com/firebase/answer/9137403?hl=en

【讨论】:

【参考方案11】:

我不确定这是否是原因,但我们可能需要在发布之前在 Android 应用中使用 Web 客户端 ID,请阅读以下文章,

https://android-developers.googleblog.com/2016/03/registering-oauth-clients-for-google.html

【讨论】:

【参考方案12】:

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

【讨论】:

【参考方案13】:

添加 SHA1 和 SHA256 应用签名证书后,它就可以工作了。

【讨论】:

【参考方案14】:

这些都是很好的答案,以防其他人试图为一个应用程序拥有多个 firebase 项目,即开发和生产,诀窍是当您想要测试生产时,您需要将 APK 上传到 Google Play,如果您使用 Google Play 来管理您的应用程序的签名。我使用了内部测试轨道,然后它开始工作了。

您不能只使用调试密钥在设备上安装 APK,因为它与 Firebase 中的生产密钥不匹配。

另一个旁注 - 正如其他人所提到的 - 出于某种原因,您需要使用“网络”OAuth 客户端 ID,而不是 Android OAuth 客户端。这对 Google 来说是一件非常令人困惑的事情。

【讨论】:

【参考方案15】:

虽然教程和配置页面建议从清单文件中获取包名,但似乎是根据“app/build.gradle”文件中的“applicationId”检查它。

目前我发现有两个地方可以设置包名:

app/src/main/AndroidManifest.xml

app/build.gradle android.defaultConfig.applicationId

就我而言,这两个名字是不同的。之前我在第一个文件中更新了包名,但忘记在 build.gradle 文件中更新。

【讨论】:

【参考方案16】:

如果你在颤抖,看看你在哪里初始化你的 GoogleSignIn,对我来说,添加 clientId 参数在 ios 上有效,但也会破坏 android 尝试一下

【讨论】:

【参考方案17】:

在我使用模拟器的情况下,我按照https://***.com/a/46767856/6800637 的步骤操作,除了输入https://console.firebase.google.com projectName/settings/general、我的签名密钥 sha1 和 sha256,我还输入了来自 [debug] 的密钥 sha1 .keystore] 当您按照上述步骤操作时会显示

【讨论】:

【参考方案18】:

此状态码表示您提供了未知的服务器客户端 ID。

所以我可以通过在 Android 客户端更改 OAuth 客户端 ID 来解决此问题:

googleSignInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken("web application client id")
            .requestEmail()
            .build()

在您的项目中的https://console.developers.google.com/apis/credentials 中,您可能需要生成:OAuth 客户端 ID -> Web 应用程序并在您的 Android 应用中使用此 Web 应用程序客户端 ID。

【讨论】:

【参考方案19】:

我最近在尝试使用 Firebase 使用 google 登录时遇到了这个问题。我可以通过将 GoogleSignInOptions 中的 requestIdToken 更新为在 google-services.json 文件中作为 client_id 提供的那个来修复它。

【讨论】:

【参考方案20】:

如果您在 Firebase 中有同一项目下的多个应用,请确保您位于正确的 (App)com.xxx.yyy 中,与您当前的匹配您在 Android Studio 中进行的项目。然后在适当的 (App)com.xxx.yyy 下更改 Firebase 设置中的 sha1 并在项目级别视图 apps->build->source 中相应地下载 Json。

【讨论】:

以上是关于谷歌登录失败 com.google.android.gms.common.api.ApiException: 10:的主要内容,如果未能解决你的问题,请参考以下文章

使用 android 基本示例登录排行榜失败并出现 com.google.android.gms.common.api.ApiException: 4:

Android Studio版本冲突/谷歌地图

谷歌地图 api 构建失败

Com.google.android.gms 已添加到输出中。请删除重复的对象

登录谷歌播放时应用程序ID与包无关?

小米MlX2 Android安装google play谷歌服务4套件