Google登录错误12500

问题描述 投票:60回答:23

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

我首先尝试使用Google Sign In Example但是我收到了一个错误(除了打印下面的堆栈跟踪之外没有更改代码)。我只使用了示例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引起的。

我跟着完整的guide,但显然它不起作用。

我从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

可能的原因是什么?

谢谢

附:这可能是一个可能的原因吗?

Google Play services out of date.  Requires 11720000 but found 10932470
android google-signin
23个回答
29
投票

只需将您的Google Play服务更新为最新版本(在本例中为11720000)。如果您使用AVD,Nexus 5和5X图像支持Google Play。模拟器启动并运行后,转到扩展控件菜单> Google Play,然后更新。


3
投票

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

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


2
投票

我认为错误来自错误的SHA1。请不要忘记在android studio中发布和调试模式之间的SHA1是不同的。而不是使用keytool来获取SHA1,你可以在android studio中使用Gradle项目 - >任务 - > android - > signingReport(可以通过菜单View - > Toolwindow - > gradle打开它)来获得释放和调试SHA1。之后,为了便于工作,您需要在Google云端控制台上创建两个单独的凭据和两个SHA1(谷歌只是指示使用版本SHA1创建1,当我们开发它时,它将无法工作,因为它使用调试SHA1)。


1
投票

对我来说,问题是在我的调试配置应用中使用'release'ClientID。确保您有一个版本和一个调试密钥,分别使用每个SHA-1。


1
投票

Cordova编译器也无法找到正确的密钥库文件。

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

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

执行命令

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

使用密码:android

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

步骤3:在platform/android目录中创建名为release-signing.properties的文件

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

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

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

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


1
投票

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


0
投票

在我的情况下,这是因为错误的Google客户端ID。我将我的密钥更改为google-services.json中列出的密钥(在oauth_client对象下)


0
投票

确保正确设置以下内容:

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

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。所以我删除了自动创建的指纹并添加了具有正确包名的指纹。繁荣!!。有效。


0
投票

当我没有启用Google选项时,错误就出现了,as shown in image

它发生在我更改Google帐户并忘记打开与Google连接的选项时。


35
投票

检查是否将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。我失去了两天。

While debug

Android工作室在第一次调试构建时自动generate ~/.android/debug.keystore并使用它来签署应用程序。

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

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

应将SHA-1添加到firebase的应用程序设置中,以便在测试调试版本时允许使用google登录功能。


0
投票

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


0
投票

我被困了一段时间。

确保执行这些步骤 -

  • 正确的SHA密钥保存在Firebase控制台上。
  • 下载最新的google-service.json
  • 最后也是最重要的保存OAuth同意在google api,OAuth Screen 的凭据下这花了很长时间才弄明白。在此之后它运作良好。

0
投票

自从2周以来我一直陷入谷歌登录问题,最后整理好了。我解释原因。这个问题与firebase有关。在firebase中,提到的字段“支持电子邮件”是可选的。但是,一旦我添加它(你的任何个人电子邮件),问题排序,我得到了答复。如果您收到错误12501,那么它与您的Google帐户中的设置有关。


-1
投票

试试这个选项:

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

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

enter image description here


-1
投票

我的解决方案:(编辑:04 / Jan / 2019)enter image description here

enter image description here

enter image description here


28
投票

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


27
投票

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

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

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

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

enter image description here


10
投票

似乎您的SHA1被Google Play商店覆盖。检查您的Google Play商店,启动面板,在应用签名下,查看Google Play是否添加了额外的SHA1。

并复制SHA1,添加到您的相关位置,将完成这项工作。


8
投票

尝试更新https://console.developers.google.com/apis/credentials上的OAuth同意屏幕


3
投票

如果仍有人遇到类似问题,如果您要添加自定义范围,请确保它是有效范围。就我而言,我将Facebook范围与谷歌范围混合在一起并花了一些时间来弄清楚它!


3
投票

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

这对我有用。

Firebase console Screenshot


3
投票

首先确保您在google developers console中注册了您的应用程序

确保您的Firebase应用程序中同时具有debugrelease键。如果生产中出现此错误,请将SHA-1 release key添加到fire base app。如果它出现在开发中,那么添加你的SHA-1 debug key

Where to add SHA-1 finger print

获取调试/发布密钥:

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

请务必将更新后的google-services.json下载到您的应用中。

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