Google登录错误12500


106

我正在尝试将Google登录集成到我的应用中。我没有后端服务器,我只是将登录的Google帐户的详细信息获取到我的应用中。

我首先使用Google登录示例进行了尝试,但出现了错误(除了打印下面的stacktrace之外,未进行任何代码更改)。我仅使用示例SignInActivity,因为我没有后端服务器。

 Exception com.google.android.gms.common.api.ApiException: 12500: 
 at com.google.android.gms.common.internal.zzb.zzz(Unknown Source)
 at com.google.android.gms.auth.api.signin.GoogleSignIn.getSignedInAccountFromIntent(Unknown Source)
 at com.ewise.android.api.MainActivity.onActivityResult(SignInActivity.java:89)     at android.app.Activity.dispatchActivityResult(Activity.java:7010)
 at android.app.ActivityThread.deliverResults(ActivityThread.java:4187)
 at android.app.ActivityThread.handleSendResult(ActivityThread.java:4234)
 at android.app.ActivityThread.-wrap20(ActivityThread.java)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1584)
 at android.os.Handler.dispatchMessage(Handler.java:102)
 at android.os.Looper.loop(Looper.java:154)
 at android.app.ActivityThread.main(ActivityThread.java:6316)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)

 public class SignInActivity extends AppCompatActivity implements
         View.OnClickListener {

     private static final String TAG = "SignInActivity";
     private static final int RC_SIGN_IN = 9001;

     private GoogleSignInClient mGoogleSignInClient;
     private TextView mStatusTextView;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);

         // Views
         mStatusTextView = findViewById(R.id.status);

         // Button listeners
         findViewById(R.id.sign_in_button).setOnClickListener(this);
         findViewById(R.id.sign_out_button).setOnClickListener(this);
         findViewById(R.id.disconnect_button).setOnClickListener(this);

         // [START configure_signin]
         // Configure sign-in to request the user's ID, email address, and basic
         // profile. ID and basic profile are included in DEFAULT_SIGN_IN.
         GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                 .requestEmail()
                 .build();
         // [END configure_signin]

         // [START build_client]
         // Build a GoogleSignInClient with the options specified by gso.
         mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
         // [END build_client]

         // [START customize_button]
         // Set the dimensions of the sign-in button.
         SignInButton signInButton = findViewById(R.id.sign_in_button);
         signInButton.setSize(SignInButton.SIZE_STANDARD);
         signInButton.setColorScheme(SignInButton.COLOR_LIGHT);
         // [END customize_button]
     }

     @Override
     public void onStart() {
         super.onStart();

         // [START on_start_sign_in]
         // Check for existing Google Sign In account, if the user is already signed in
         // the GoogleSignInAccount will be non-null.
         GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
         updateUI(account);
         // [END on_start_sign_in]
     }

     // [START onActivityResult]
     @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);
             handleSignInResult(task);
         }
     }
     // [END onActivityResult]

     // [START handleSignInResult]
     private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
         try {
             GoogleSignInAccount account = completedTask.getResult(ApiException.class);

             // Signed in successfully, show authenticated UI.
             updateUI(account);
         } catch (ApiException e) {
             // The ApiException status code indicates the detailed failure reason.
             // Please refer to the GoogleSignInStatusCodes class reference for more information.
             Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
             e.printStackTrace();
             updateUI(null);
         }
     }
     // [END handleSignInResult]

     // [START signIn]
     private void signIn() {
         Intent signInIntent = mGoogleSignInClient.getSignInIntent();
         startActivityForResult(signInIntent, RC_SIGN_IN);
     }
     // [END signIn]

     // [START signOut]
     private void signOut() {
         mGoogleSignInClient.signOut()
                 .addOnCompleteListener(this, new OnCompleteListener<Void>() {
                     @Override
                     public void onComplete(@NonNull Task<Void> task) {
                         // [START_EXCLUDE]
                         updateUI(null);
                         // [END_EXCLUDE]
                     }
                 });
     }
     // [END signOut]

     // [START revokeAccess]
     private void revokeAccess() {
         mGoogleSignInClient.revokeAccess()
                 .addOnCompleteListener(this, new OnCompleteListener<Void>() {
                     @Override
                     public void onComplete(@NonNull Task<Void> task) {
                         // [START_EXCLUDE]
                         updateUI(null);
                         // [END_EXCLUDE]
                     }
                 });
     }
     // [END revokeAccess]

     private void updateUI(@Nullable GoogleSignInAccount account) {
         if (account != null) {
             mStatusTextView.setText(getString(R.string.signed_in_fmt, account.getDisplayName()));

             findViewById(R.id.sign_in_button).setVisibility(View.GONE);
             findViewById(R.id.sign_out_and_disconnect).setVisibility(View.VISIBLE);
         } else {
             mStatusTextView.setText(R.string.signed_out);

             findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE);
             findViewById(R.id.sign_out_and_disconnect).setVisibility(View.GONE);
         }
     }

     @Override
     public void onClick(View v) {
         switch (v.getId()) {
             case R.id.sign_in_button:
                 signIn();
                 break;
             case R.id.sign_out_button:
                 signOut();
                 break;
             case R.id.disconnect_button:
                 revokeAccess();
                 break;
         }
     }
  }

据我了解,该问题可能是由SHA1 Generation引起的。

我遵循了完整的指南,但显然没有用。

我从gradle signingReport复制了SHA1

Variant: debug
Config: debug
Store: /Users/user/.android/debug.keystore
Alias: AndroidDebugKey
MD5: A3:16:3F:43:75:FE:07:62:6D:8D:CC:DD:21:9F:FA:1A
SHA1: 7B:21:26:7F:D8:18:BB:0E:36:1C:82:DD:B7:28:5F:C1:2F:5C:E4:EA
Valid until: Saturday, August 31, 2047
----------
Variant: release
Config: none
----------
Variant: debugAndroidTest
Config: debug
Store: /Users/user/.android/debug.keystore
Alias: AndroidDebugKey
MD5: A3:16:3F:43:75:FE:07:62:6D:8D:CC:DD:21:9F:FA:1A
SHA1: 7B:21:26:7F:D8:18:BB:0E:36:1C:82:DD:B7:28:5F:C1:2F:5C:E4:EA
Valid until: Saturday, August 31, 2047
----------
Variant: debugUnitTest
Config: debug
Store: /Users/user/.android/debug.keystore
Alias: AndroidDebugKey
MD5: A3:16:3F:43:75:FE:07:62:6D:8D:CC:DD:21:9F:FA:1A
SHA1: 7B:21:26:7F:D8:18:BB:0E:36:1C:82:DD:B7:28:5F:C1:2F:5C:E4:EA
Valid until: Saturday, August 31, 2047

这可能是什么原因?

谢谢

PS这可能是原因吗?

Google Play services out of date.  Requires 11720000 but found 10932470

嘿,你能请把你的代码
迪利普

大家好,@ Dilip我确实使用了这个:) github.com/googlesamples/google-services/tree/master/android/…。无论如何都对其进行了更新
亚伦

1
因此,发生同样的错误或发生其他任何事情的情况。请手动将时间再多一次SHA1,并针对您的APP放在开发人员控制台,然后交叉检查程序包名称,然后下载google-services.json文件并置于应用程序级别。
Dilip

是的@Dilip我遇到了同样的错误。我越过已检查的包裹名称。我什至尝试使用另一个密钥库,但结果是相同的。
亚伦

您需要更改代码,以获得您的 API密钥。是的,您应该更新播放服务
OneCricketeer

Answers:


37

只需将您的Google Play服务更新到最新版本(在这种情况下为11720000)。如果您使用的是AVD,则Nexus 5和5X图像均支持Google Play。模拟器启动并运行后,进入“扩展控件菜单”>“ Google Play”,然后进行更新。


如何在三星设备上做到这一点?
Pinkesh Darji '19

7
就我而言,这不是问题。Google Play服务已经是最新的。
亚当·赫维兹

@ zub0r 关于项目和隐私链接解决方案应被接受为正确答案。
亚当·赫维兹

请在仿真器或Visual Studio上的扩展控件菜单在哪里?
乔治·乌德森

121

错误PlatformException(sign_in_failed,com.google.android.gms.common.api.ApiException:12500:,null)

可以通过 在项目设置中向项目添加支持电子邮件地址来解决此12500错误 打开链接 https://console.firebase.google.com/

选择您的项目并打开设置选项卡。

提供有效的支持电子邮件并立即重新启动您的应用程序。

在此处输入图片说明


9
谢啦!此错误非常隐蔽,可能表示此处答案中提到的任何内容。我的问题是这个:(
比尔达,

3
我花了一天的时间尝试放置SHA-1指纹后,做了开发人员控制台developers.google.com/identity/sign-in/android/sign-in中提到的所有事情,这就是问题所在。你帮了 非常感谢!
类Android

尝试为您的项目添加SHA1密钥@RohitSingh
Maddu Swaroop,

1
@MadduSwaroop如果只有一种方法可以投票两次...感谢先生
Lefty

1
您保存了我的一天
侯赛姆

46

检查SHA-1指纹是否已添加到Firebase项目设置中。如果没有,请使用查找SHA-1指纹

https://developers.google.com/android/guides/client-auth

另外,使用以下命令找到释放密钥的SHA-1指纹

keytool -list -v -keystore <keystore path>

<keystore path>使用密钥库的路径除去。

然后将两个SHA-1指纹添加到Firebase项目设置中。

注意:别忘了用新的指纹将google-services.json替换为更新的google-services.json。我输了两天。

调试时

Android Studio会在首次调试时自动生成 ~/.android/debug.keystore,并使用它来对应用进行签名。

要获得SHA-1运行(密码android)(doc):

keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore

SHA-1应该添加到位于的应用设置中firebase,以便在测试调试版本时允许使用Google登录功能。


2
您如何确定他正在使用Firebase?
PaulG

猜对了(代码相似和无服务器)。Firebase项目也已连接到GCP控制台。我们还可以更改GCP凭据中的指纹。
Niyas Nazar

同样的错误,但在我的情况下,它与Firebase不相关(我没有使用它)。
Majed DH

转到console.developers.google.com/apis/credentials 。使用SHA密钥添加新的凭据(O Auth客户端)。(Firebase会自动为我们的Firebase项目执行此操作)
Niyas Nazar

google-services.json文件可在项目内的app目录中找到。(经过搜索/文件管理器)
MEHUL Tandale

43

 对于错误12500,您只需要在firebase的设置中添加支持gmail,对于错误10,请在firebase控制台中添加ssh指纹,如图所示


好而直接的答案,只需配置我的gmail帐户并进行其余操作即可
Ajeett

43

支持电子邮件以及所有项目和隐私链接对于Google SignIn来说是必需的,否则将抛出12500。

在名为“ OAuth同意屏幕”的第二个标签底部的https://console.developers.google.com/apis/credentials上进行设置 -您会在这里找到三个需要配置的链接。

Firebase指南中没有任何提及。


3
谢谢,它为我工作。我几乎整天都在浪费时间解决问题
krishan kumar Sharma

2
谢谢,我只是在隐私链接中添加了一个“授权域”,一切正常。您为我节省了数小时的反复试验💌–
Coco

这应该被接受。我一直在为那两天苦苦挣扎,但没有成功。Google应该更新指南,因为它们的文档现在具有误导性,它们的指南将永远无法工作,并且错误代码无法说明任何问题
user1209216

1
在哪里添加隐私链接?
Shihab Uddin

4
在名为“ OAuth同意屏幕”的第二个选项卡上-在表单底部,您具有三个链接
zub0r


18

我被卡住了一段时间。

确保执行以下步骤-

  • 正确的SHA密钥已保存在Firebase控制台上。
  • 下载最新的google-service.json
  • 最后一次也是最重要的是, 在Google api的凭据下保存OAuth同意, OAuth屏幕花了很长时间才弄清楚。在此之后,它运行良好。

6
好。这应该是这里2019年的公认答案。谷歌奇怪地“必须”更新OAuth同意
书中

1
gh,对此再次投票。完全是我晦涩的问题。
easycheese

12

似乎您的SHA1已被Google Play商店覆盖。在Google Play商店的启动面板中的应用程序签名下签入,查看Google Play是否已添加其他SHA1。

然后复制该SHA1,并将其添加到您的相关位置,即可完成工作。


1
哦,我的上帝!感谢您的提示!App Bundles创建了自己的SHA1,因此本地(生成APK时)使用的发布密钥不再正确。
贾谢

这是有史以来最令人困惑的工作流程。不过谢谢你的提示
DarkNeuron

5

如果仍然有其他人遇到类似的问题,如果要添加自定义范围,请确保它是有效范围。就我而言,我将Facebook范围和Google范围混合在一起,花了我一段时间才弄清楚!


5

我正在使用Firebase身份验证。正确指示了我的SHA-1,客户端ID也正确,但是我仍然得到12500。

原来,我的问题是我没有在项目设置中指出支持电子邮件。(设置->常规选项卡->您的项目(公共设置)部分)。


3
我也发生了同样的事情。Google的服务存在严重的文档问题。我希望他们记录了此类问题,或者至少显示了一个用户友好的错误。
ashish-goel

4

在Firebase控制台中转到您的项目,打开“项目设置”,然后在其中添加SHA证书指纹。下载更新后的google-services.json文件,并将其添加到您的Projects应用文件夹。

这对我有用。

Firebase控制台截图


3

我认为错误来自错误的SHA1。请不要忘记,在Android Studio中,SHA1在发布和调试模式之间有所不同。您可以使用android studio中的Gradle项目-> Task-> android-> signingReport(可以通过菜单View-> Toolwindow-> gradle来打开它)来获取发布和调试SHA1,而不是使用keytool获取SHA1。此后,为了便于工作,您需要在Google云控制台上使用两个SHA1创建2个单独的凭据(Google只是指示使用发行版SHA1创建1个凭证,在我们开发时由于使用调试SHA1而无法使用它)。


3

首先,请确保您已在Google Developers Console中注册了您的应用

确保Firebase应用程序中同时有debugrelease键。如果此错误出现在生产环境中,则将您的SHA-1 release key应用添加到Fire基本应用中。如果它正在开发中,则添加您的SHA-1 debug key

在哪里添加SHA-1指纹

获取调试/发布键:

keytool -exportcert -list -v -alias [your alias] -keystore [path/to/debug or release.keystore]

确保将更新下载google-services.json到您的应用程序。


我在GoogleSignInResult.getSuccess()返回false和12500的代码时失败。最终,这是别人用我的SHA1而不是调试键设置了我的OAuth。这样就解决了。
鲁ck

@鲁eck我很高兴这有所帮助!
Denn

2

对我来说,问题是在经过调试配置的应用中使用了“发布” ClientID。确保分别具有每个SHA-1的版本和调试密钥。


2

如果您是扑扑而来:这是我们必须根据此处的文档修复的一些极端情况:https : //pub.dev/packages/google_sign_in 在此处输入图片说明

  • 转到Google API和服务
  • 选择您要实现Google登录的应用。
  • 然后点击启用APIS和服务

在此处输入图片说明

  • 然后搜索Google Peoples API

在此处输入图片说明

  • 打开Goog​​le People API卡,然后点击启用,您的应用可能会摆脱该问题。

2

当您的应用通过后端服务器进行身份验证或从后端服务器访问Google API时,则在构造GoogleSignInOptions对象时,必须将为服务器创建的OAuth 2.0客户端ID传递给requestIdToken方法,以访问用户的基本个人资料信息。另外,不要忘记在API控制台“凭据”页面的OAuth同意屏幕中提交支持电子邮件。


1

还可能发生的是cordova编译器无法找到正确的密钥库文件。



解决方案:在执行之前ionic cordova build android指定签名属性

步骤1:生成调试密钥库文件

执行命令

keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore

使用密码: android

步骤2:将密钥库文件(debug.keystore)从复制~/.androidplatform/android当前项目的目录

步骤3:在目录中创建一个名为release-signing.propertiesplatform/android文件

步骤4:在文件中添加内容

storeFile=debug.keystore
keyAlias=androiddebugkey
storePassword=android
keyPassword=android

注意:这些是默认值。如果您提供了自定义别名和密码,请相应地使用它们。

步骤5:现在建立ionic cordova build android


1

在另一台计算机(不同的Android Studio)上打开项目后,我遇到了同样的问题。就我而言,我使用Firebase助手解决了该问题,该助手最初是用来设置Firebase的。打开Firebase助手(“工具”>“ Firebase”),然后选择“身份验证”>“连接”。这将项目重新连接到Firebase并更新了配置


1

自2周以来,我一直陷在Google登录问题中,最终得到了很好的分类。让我解释一下原因。该问题与firebase有关。在firebase中,他们提到了“支持电子邮件”字段是可选字段。但是,一旦我添加了它(您的任何个人电子邮件),问题就解决了,我得到了答复。如果您遇到错误12501,则该错误与您的Google帐户中的设置有关。


1

我被卡住了一段时间。

确保执行以下步骤-

Correct SHA key is saved on Firebase Console.
Valid reversed client id.
from fcm console=>select app=>from authentication=>enable google sign-in method

0

就我而言,这是由于错误的Google客户ID。我将密钥更改为google-services.json(在oauth_client对象下方)列出的密钥


0

确保已正确设置以下各项:

  1. 在您的Google Project中生成客户端ID。
  2. 为该客户ID提供正确的SHA-1密钥。(调试/发布)
  3. 为该客户ID提供正确的软件包名称。
  4. 请确保您有生成客户端ID中strings.xmlgoogle-services.jsoncredentials.json文件。

0

https://developers.google.com/identity/sign-in/android/sign-in 遵循此api文档,但请记住,在WEB_CLIENT_ID内部使用google-services.json文件内部生成的客户端ID的值。

class MainActivity : AppCompatActivity(), GoogleApiClient.OnConnectionFailedListener {
private val TAG = "JSAGoogleSignIn"
private val REQUEST_CODE_SIGN_IN = 1234
private val WEB_CLIENT_ID = "354298333018-XXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com"
private var mAuth: FirebaseAuth? = null

private var mGoogleApiClient: GoogleApiClient? = null
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    var txt_register = findViewById<TextView>(R.id.txt_register)
    txt_register.setOnClickListener {
        var intent = Intent(this@MainActivity, RegisterActivity::class.java)
        finish()
        startActivity(intent)
    }
    val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(WEB_CLIENT_ID)
            .requestEmail()
            .build()
    mGoogleApiClient = GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build()

    mAuth = FirebaseAuth.getInstance()
    sign_in_button.setOnClickListener {
        val intent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient)
        startActivityForResult(intent, REQUEST_CODE_SIGN_IN)
    }

}


override fun onConnectionFailed(p0: ConnectionResult) {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}


private fun updateUI(user: FirebaseUser?) {
    if (user != null) {
        Log.e("Email", "Value" + user.email)
    }

}

fun signIn() {

}

override fun onStart() {
    super.onStart()
    val currentUser = mAuth!!.currentUser
    updateUI(currentUser)
}

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

    // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
    if (requestCode == REQUEST_CODE_SIGN_IN) {
        val result = Auth.GoogleSignInApi.getSignInResultFromIntent(data)
        if (result.isSuccess) {
            // successful -> authenticate with Firebase
            val account = result.signInAccount
            firebaseAuthWithGoogle(account!!)
        } else {
            // failed -> update UI
            updateUI(null)
            Toast.makeText(applicationContext, "SignIn: failed!" + result.status,
                    Toast.LENGTH_SHORT).show()
        }
    }
}

private fun firebaseAuthWithGoogle(acct: GoogleSignInAccount) {
    Log.e(TAG, "firebaseAuthWithGoogle():" + acct.id!!)

    val credential = GoogleAuthProvider.getCredential(acct.idToken, null)
    mAuth!!.signInWithCredential(credential)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Sign in success
                    Log.e(TAG, "signInWithCredential: Success!")
                    val user = mAuth!!.currentUser
                    updateUI(user)
                } else {
                    // Sign in fails
                    Log.w(TAG, "signInWithCredential: Failed!", task.exception)
                    Toast.makeText(applicationContext, "Authentication failed!",
                            Toast.LENGTH_SHORT).show()
                    updateUI(null)
                }
            }
}

0

以我为例,在Firebase控制台中添加指纹后,它会被Google开发者控制台自动提取并显示指纹。但是登录不起作用。看完每一步之后,我发现Google像这样反转了清单文件包com.xxxxxxxx.app。但这实际上是app.xxxxxxxx.com在Google开发人员控制台中。因此,我删除了自动创建的指纹,并使用正确的程序包名称添加了指纹。繁荣!!。有效。


0

当未启用Google选项时,该错误向我显示如图所示

当我更改了Google的帐户却忘记了打开与Google连接的选项时,发生了这种情况。


0

确保您的项目中不得包含任何特殊字符,包括数字或任何类型的符号(项目名称应简单地为com.google.testproject)


那就是项目包名称而不是项目名称
b devloper

0

以我为例,我正在开发一个非生产型应用程序,问题是在Firebase控制台中创建项目时,在Firebase和Google开发人员控制台之间来回同步SHA-1密钥时出现问题。因此,我决定先在Google Developer控制台上创建项目,然后在Firebase控制台上创建新项目时选择它。

我也为此编写了一个教程,可能会对您有所帮助。


0

就我而言,问题是我的模拟器没有Play商店。我已经通过Visual Studio制作了模拟器(名为API 23),因为我也使用Xamarin.Forms进行开发,并且在Visual Studio的Android设备管理器中,您可以选择模拟器是否应具有Google Play商店。

必须通过Android Studio的AVD创建一个模拟器,并确保它具有Play商店:

在此处输入图片说明


0

在我的情况下,出现此错误是因为高级团队删除了android auth,因为在后端身份验证中似乎不需要android密钥。因此,在Google登录中同时需要Android和Web客户端密钥。


-1

试试这个选项:

keytool -list -v -keystore C:\Users\MG\Desktop\test.jks -alias test

它提示输入密码,只需输入密码。您可以看到SHA1,MD5指纹。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.