Google 登录错误12500

我正在尝试将谷歌登录整合到我的应用程序中。我没有一个后端服务器,我只是得到了详细的登录谷歌帐户到我的应用程序。

我第一次尝试使用 例如谷歌签名,但我得到了一个错误(没有代码更改,除了打印下面的堆栈跟踪)。我只是使用了 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一代引起的。

我跟踪了完整的 向导但显然没用。

我从 签署报告级复制了 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
126546 次浏览

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

如果仍然有人有类似的问题,如果您正在添加自定义作用域,请确保它是一个有效的作用域。在我的案例中,我把 Facebook 的范围和 Google 的范围混合在一起,花了一段时间才弄明白!

检查是否将 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 工作室自动 产生 ~/.android/debug.keystore对第一个 调试版本和使用它来签署应用程序。

要运行 SHA-1(密码 android)(医生) :

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

这个 SHA-1应该添加到 firebase的应用程序设置,以允许使用谷歌登录功能,同时测试调试构建。

对我来说,问题是在我的调试配置应用程序中使用“发布”ClientID。确保您有一个发布版本和一个调试键,分别使用每个 SHA-1。

看来你的 SHA1被谷歌游戏商店覆盖了。 检查在您的谷歌播放商店,启动面板,下应用程序签名,看看谷歌播放有一个额外的 SHA1添加。

并复制 SHA1,添加到您的相关地方,将做这项工作。

试试以下选项:

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

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

enter image description here

也可能发生 Cordova 编译器无法找到正确的密钥存储库文件。



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

步骤1 : 生成一个调试密钥存储库文件

执行命令

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

使用密码: android

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

步骤3: platform/android目录中创建一个名为 Release-sign. properties的文件

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

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

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

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

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

我认为错误来自错误的 SHA1。请不要忘记,SHA1是不同的发布和调试模式在安卓工作室。你可以在 android 工作室中使用 Gradle project-> Task-> android-> signingReport (可以通过菜单 View-> Toolwindow-> Gradle 打开它)来获得发布和调试 SHA1,而不是使用 keytool 来获得 SHA1。之后,为了便于工作,您需要创建2个单独的凭证与两个 SHA1在谷歌云控制台(谷歌只是指示创建1使用发行版 SHA1,当我们开发它将不工作,因为它使用调试 SHA1)。

确保下列事项设置正确:

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

在另一台计算机(不同的 Android Studio)上打开项目后,我也遇到了同样的问题。 在我的案例中,我使用 Firebase Assistant 解决了这个问题,我最初使用它来设置 Firebase。 打开 Firebase Assistant (Tools > Firebase)并选择 Authentication > Connect。 这将项目重新连接到 Firebase 并更新了配置

在 Firebase 控制台中转到您的项目,打开项目设置,在那里添加您的 SHA 证书指纹。下载更新的谷歌服务。Json 文件,并将其添加到您的项目应用程序文件夹。

这招对我很管用。

Firebase console Screenshot

我的解决方案: (编辑: 2019年1月4日) enter image description here

enter image description here

enter image description here

首先确保你在 谷歌开发者控制台中注册了你的应用程序

确保在 Firebase 应用程序中同时具有 debugrelease键。如果这个错误出现在生产中,添加您的 SHA-1 release key火基地应用程序。如果它出现在开发中,然后添加您的 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到您的应用程序。

Https://developers.google.com/identity/sign-in/android/sign-in 请遵循这个 api 文档,但是请记住,在 WEB _ CLIENT _ ID 中使用的是在 google-services 中生成的客户端 id 的值。Json 文件。

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)
}
}
}

在我的案例中,在 Firebase 控制台中添加指纹后,它会被 Google 开发者控制台自动提取并显示指纹。但是登录不起作用。在查看了每个步骤之后,我发现 Google 逆转了我的清单文件包,就像这个 com.xxxxxxxx.app。但它实际上是 app.xxxxxxxx.com,在谷歌开发者控制台。所以我删除自动创建一个指纹,并添加指纹与正确的包名称。轰! !.成功了。

当没有启用 Google 选项时,出现了这个错误, 如图片 所示。

当我更改了谷歌的账户,忘记打开与谷歌连接的选项时,就发生了这种情况。

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

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

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

错误 PlatformException (sign _ in _ false,com.google.android.gms.common.api. ApiException: 12500: ,null)

这个12500错误可以通过添加一个 < strong > 支持电子邮件地址来解决项目设置。打开链接到您的项目 Https://console.firebase.google.com/

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

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

enter image description here

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

我被困在这里一段时间了。

确保执行这些步骤-

  • 正确的 SHA 键保存在 Firebase 控制台上。
  • 下载最新的 google-service. json
  • 最后和 最重要的保存 OAuth 同意根据凭证在谷歌应用程序接口, OAuth Screen 花了很长时间才弄明白。 之后一切都很顺利。

我被困在谷歌登录问题从2个星期以来,终于排序好。让我解释的原因。 这个问题与火源有关。在 firebase 中,他们提到一个字段“支持电子邮件”是可选的。但是一旦我添加它(任何你的个人电子邮件) ,问题排序,我得到了回应。 如果你得到一个错误为12501,那么它是相关的设置在您的谷歌帐户。

支持电子邮件和 所有项目及私隐连结也是必要的谷歌登录工作,否则它抛出12500。

将它设置在第二个选项卡底部的 https://console.developers.google.com/apis/credentials上,名为“ OAuth 同意屏幕”——在那里你会发现三个需要配置的链接。

Firebase 指南中没有提到这一点。

如果你从 颤抖来到这里 : 这是根据这里的文档我们必须修复的一个角落案例: < a href = “ https://pub.dev/package/google _ sign _ in”rel = “ nofollow norefrer”> https://pub.dev/packages/google_sign_in enter image description here

  • 转到 Google API 和服务
  • 选择要实现谷歌登录到的应用程序。
  • 然后单击 Enable APIS and Services

enter image description here

  • 然后搜索谷歌人民 API

enter image description here

  • 打开 Google People API 卡,点击启用,你的应用程序可能会解决这个问题。

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

在我的案例中,我正在开发一个非生产应用程序,问题是当在 Firebase 控制台上创建一个项目时,在 Firebase 和 Google 开发者控制台之间来回同步 SHA-1键会出现问题。因此,我决定首先在 GoogleDeveloper 控制台上创建项目,然后在 Firebase 控制台上创建新项目时选择它。

我还为此做了 教程,可能对你有帮助。

我被困在这里一段时间了。

确保执行这些步骤-

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

在我的例子中,问题是我的模拟器没有 Play Store。我通过 VisualStudio 制作了这个模拟器(命名为 API 23) ,因为我使用 Xamarin 进行开发。表单也是如此,在 VisualStudio 的 Android 设备管理器中,您可以选择模拟器是否应该有 Google Play Store。

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

enter image description here

在我的案例中,出现这个错误是因为高级团队删除了 android 认证,因为后端认证似乎不需要 android 密钥。因此,谷歌登录需要安卓和 Web 客户端密钥。

启用谷歌登录方法为我工作 - 认证-> 登入方法-> 谷歌 enter image description here

我尝试了所有的答案,仍然得到 12500。事实证明,对我来说,解决方案甚至更简单-我的项目已经 User Type设置为 internal,我试图登录我的公司以外的电子邮件。因此,如果没有以前的答案为您工作,检查如果您有 User Type设置为内部或外部,如果您尝试登录可接受的帐户。

enter image description here

  1. 启用登录方法 GOOGLE. * * (不必要)

enter image description here

  1. 打开项目设置。

enter image description here

  1. 提供电子邮件支持。

enter image description here

我知道这看起来很傻,但是我的模拟器出现了这个错误,当我启动一个安装了 Google Play API 的模拟器时,这个问题就解决了。

我也遇到过类似的问题,更新支持邮件和 OAuth 同意屏幕表格不起作用,但是添加 Google Play Store 应用程序签名密钥证书到 Firebase 控制台起作用了:

  1. 从 Google Play 控制台复制应用程序签名键(安装程序-> 应用程序完整性-> 应用程序签名)

enter image description here

注意,这些键是随机生成的,并不是我的项目的键。

  1. 将密钥添加到 Firebase 控制台。

enter image description here

我认为每个人都应该在构建应用程序的发行版或调试版之前运行这个程序来开始调试。

flutter clean

每次更改 google-services.jsonAndroidManifest.xml文件

在我运行这个命令之前,什么都不管用

扑克官方文件也提到了这一点

 Note: You may need to run flutter clean after changing the gradle file. This prevents cached builds from affecting the signing process.

enter image description here

Https://docs.flutter.dev/deployment/android#configure-signing-in-gradle

编辑: 我使它工作在生产或开发环境。经过几天的测试,我再次遇到这个问题,我正在测试不同版本的应用程序安装,卸载和升级所有这些东西。除了再次运行 flutter clean之外,我无法修复它。

在我尝试了上述所有解决方案之后,没有一个奏效。 我发现我请求的范围在云中没有提到。 这是我的原则

final GoogleSignIn googleSignIn = new GoogleSignIn(
scopes: [
'https://www.googleapis.com/auth/userinfo.email',
'https://www.googleapis.com/auth/userinfo.profile',
'https://www.googleapis.com/auth/openid',
'https://www.googleapis.com/auth/youtube.force-ssl'
]);

在我移除所有视野后,成功了。

我的瞄准镜区域是空的: enter image description here

作用域标签可以在这里找到: https://console.cloud.google.com/apis/credentials/consent/edit