新的GoogleloginAndroid

我尝试使用新的Google Play服务8.3获取用户令牌ID,并按照所logging的方式传递服务器ID:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.server_client_id)) .requestEmail() .build(); 

但是我仍然得不到成功的结果如下:

 {statusCode=unknown status code: 12501, resolution=null} 

并在这里loggingGoogleSignInStatusCodes

login被用户取消。 即用户取消了一些login解决scheme,例如账户select或OAuth同意。

常数值:12501

这不是我的情况,因为我已经select了一个帐户。 任何想法可能是什么原因?

我有完全相同的问题,我find了解决办法。

如果您按照这里find的文档: https : //developers.google.com/identity/sign-in/android/start-integrating

第一步告诉您创buildconfiguration文件(为您创build一个OAuth 2.0客户端ID并将其插入到google-services.json中)

然后,再次说明如何创build一个OAuth 2.0客户端ID,但这次它说,你必须为Web应用程序做这件事

这是令人困惑的部分! (至less对我来说),因为我只是为Android OAuth创build的客户端ID,而不是为Web应用程序创build一个新的(我认为文档是多余的或什么的)

正如它所说的那样,只有这一个,你必须使用它作为方法requestIdTokenrequestServerAuthCode的参数。

忘记在这个方法中使用Android OAuth ID,因为那样你会得到所有的丑陋的状态码响应12501。

我认为主要的问题是这个文档有点混乱。 或者,也许是因为您必须创build两个OAuth ID才有点奇怪。

所以作为一个总结, 您需要两个OAuth ID,一个用于android,一个用于web应用程序,您必须在正确的位置设置每个OAuth ID。

我一直在为此挣扎,浪费了将近一周的时间。

这是我得到它的工作。

  1. 在AndroidStudio中导入项目
  2. 为项目创builddebugging密钥库。
  3. 使用debugging密钥库为项目创buildSHA1签名。
  4. 使用SHA1签名,在Google Developer Console上注册您的Google Signin应用。
  5. 在那里生成一个Googleconfiguration文件(放入Android Studio的app文件夹)
  6. 在Android项目中使用来自OAuth 2.0凭据的Web客户端ID。
  7. 现在,从Android Studio中生成您的项目的debugging版本(APK)。
  8. 将设备挂载到您的系统中 – >复制APK的此签名debugging版本并安装它。

最后三步6,7和8 ,你真的需要照顾。 如果你直接运行该项目,那么APK实际上并没有用debugging密钥库签名,而Google根本不能识别它。

我有同样的问题,经过研究解决scheme,它恢复了server_client_id包含一些不正确的值,或者您的google_services.json不包括与您的密钥库注册的client_id oauth_client。

 requestIdToken(getString(R.string.server_client_id)) 

R.string.server_client_id使用Web应用程序的 OAuth 2.0客户端ID。 Android中使用的OAuth客户端ID在google_services.json中使用

通常我们使用2个密钥库,1个使用debugging密钥库,1个使用签名密钥库进行发布。 因此,如果我们希望在debugging和发布模式下需要,请为Android注册您的OAuth客户端ID两次,1使用debugging密钥库中的SHA1和已签名密钥库中的一个来发布。

在我的google_services.json小例子

  "oauth_client": [ { "client_id": "xxx-client-id.com", "client_type": 1, "android_info": { "package_name": "com.app.android", "certificate_hash": "xxxhash" } }, { "client_id": "yyy.client-id.com", "client_type": 1, "android_info": { "package_name": "com.app.android", "certificate_hash": "yyyhash" } } ], 

我遇到了同样的问题,这是因为我创build了应用程序typesAndroid的客户端ID

相反,我删除它,并创buildtypes的Web应用程序的客户端ID,我摆脱了这个问题。

只是想出如何解决这个问题…我试图运行我的应用程序的debugging版本时得到这个错误…要解决它,添加您的debugging应用程序在开发者控制台上,也在谷歌服务以.json。

这为我修好了!

我有同样的问题,我解决了以下的解决scheme:

  1. 按照此处所述创buildconfiguration文件(google-services.json)并放置在/ app项目目录中
  2. (正如在其他答案中提到)使用Web应用程序客户端ID为requestIdToken方法。
  3. [我的主要问题]签署你的应用程序,如果你在像下面的debugging模式:
  signingConfigs { release { storeFile file("myreleasekey.keystore") storePassword "password" keyAlias "MyReleaseKey" keyPassword "password" } } buildTypes { release { ... } debug { ... signingConfig signingConfigs.release } } 

就我而言,我还必须检查debuggingSHA-1是否被添加为有效的OAuth Android客户端。

现在我懂了。

因此,首先您必须遵循以下答案:1.在Google Developers Console中为Web应用程序创buildOAuth客户端ID,并在requestIdToken()使用它(取消状态码12501)2.如果您创build了Android OAuth客户端-id生成哈希键,为您的debugging哈希键创build一个新的Android OAuth客户端ID,并将其集成到您的google-services.json中。 (摆脱状态码12500)

最后一部分是:3.你不能一次调用requestIdToken()requestEmail() 。 至less在我的情况下Result: Status{statusCode=INTERNAL_ERROR, resolution=null}通过删除requestEmail() Result: Status{statusCode=INTERNAL_ERROR, resolution=null}摆脱了Result: Status{statusCode=INTERNAL_ERROR, resolution=null}

所以祝你好运…

使用Web应用程序作为server_client_id而不是Android应用程序

我有同样的问题,我注意到,当我的server_client_id包含一些不正确的值12501代码返回。

由于没有详细的消息,这个错误代码的文档相当差,我不知道你的问题是否与我的原因相同。


我的应用程序是基于这个例子 (类IdTokenActivity)的Android代码。 为了使它工作,我还需要将Googlelogin集成到我的应用程序中:

  • 生成的JSONconfiguration文件与启用谷歌login
  • 添加谷歌插件和依赖到我的gradle文件
  • 为此应用创build了OAuth客户端ID,并将其作为server_client_id保存在我的项目中

您的apk是否处于debugging模式? 我认为它只适用于已签名的apk。

  1. 遵循模糊的谷歌文件。
  2. 将google-services.json放到您的项目目录中
  3. 设置您的gradle为https://stackoverflow.com/a/35216421/5886475

  4. 在string.xml中设置server_client_id,这是你的networking客户端ID不是Android客户端

我遇到的问题是我生成的SHA-1与不正确的别名一样。 别名必须是androiddebugkey 。 所以我已经把Android OAuth ID放在了我的google-service.json文件中。 我已经把Web客户端ID设置为requestIdToken() 。 在我的具体情况下,我用androiddebugkey别名生成SHA-1。

google-services.json

 "oauth_client": [ { "client_id": "ANDROID OAUTH ID-.....apps.googleusercontent.com", "client_type": 1, "android_info": { "package_name": "br.com.packagename", "certificate_hash": "SHA-1 HASH" } },{ "client_id": "WEB CLIEND ID......apps.googleusercontent.com", "client_type": 3 } ] 

签署部分:

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken("WEB CLIEND ID......apps.googleusercontent.com") .requestEmail() .build(); 

代替R.string.server_client_id ,只需使用R.string.default_web_client_id

当您将google-services.json文件复制到应用程序中时,它会自动创build此string值。 您不需要将密钥从google-services.json复制到string.xml它为我工作。

我通过单击Android Studio中的Firebase支持来解决此问题,这可能与非Firebase用户无关。

  1. 转到菜单工具 – > Firebase
  2. 点击将您的应用连接到Firebase,一旦连接成功,它将显示为已连接
  3. 点击将Firebase身份validation添加到您的应用button,它也会变成绿色。

注意:这里有大量的答案确实证实了一件事。 Google需要更新并保持文档的安全性。

如果以上选项都不起作用,请检查您的应用程序build.gradle中的applicationId是否与您的包名称相同。

不知道为什么,但在Android Studio中的SHA1会自动更改,这就是为什么我得到这个错误。 为了解决这个问题,我使用我的android studio的新SHA1更新了我的firebase项目设置的SHA1,并重新开始工作。

就我而言,我在Google API控制台上Client ID for Android凭证只包含用于我发布的APK的SHA-1。 Android Studio使用默认的debugging密钥库来签署我的debugging版本,在这种情况下,debugging密钥库SHA-1在线与Android客户端SHA-1 匹配。 我的解决scheme是用发行密钥库简单地签署debugging版本。

在Android Studio中, Build/Edit Build Types... ,然后select您的debugging版本types,并确保签名configuration设置为您的版本证书。

签署配置集发布

我有同样的问题,错误12501和以上的非我不工作。

我的问题是我使用谷歌默认的网页API为我生成。 创build自己的网页后,API错误消失,工作正常!

这些是工作步骤:

  1. 首先我创build了SHA1debugging密钥并添加到Firebase控制台。 从这里创buildSHA1。
  2. 从这里创buildweb api和android OAuth 2.0客户端ID
  3. Firebase控制台生成google-service.json并放入应用文件夹。
  4. 把这个代码GoogleSignnOption

喜欢这个:

 gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken ("put the web app client Id that get from the link in developer console ") .requestEmail().build(); 

技巧1:我发现你应该创buildandroid和web应用程序客户端ID工作。

提示2:如果你像我这样的伊朗,你可以从谷歌获得用户,但你不能AuthWithGoogle和结果将auth.signInWithCredential(credential) fail ,你必须使用一些代理返回true。

这是github中FireBaseAuthDemo的完整源代码:

在这里输入图像说明

希望帮助完整

如果使用debugging密钥库构build项目,则需要在Firebase控制台上添加debug.keystore的SHA-1指纹。

  1. 在您的Firebase控制台上 ,打开您的项目
  2. 转到参数。 标签一般
  3. 在这个页面的末尾,有一个字段可以添加指纹SHA-1
  4. 将SHA-1粘贴到控制台字段中。

要获取debug.keystore的SHA-1,请执行以下操作:

Mac / Linux:

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

Windows:

  keytool -exportcert -list -v -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore 

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

就这样 !

按照Google的自动签名应用说明,我也遇到了这个问题。 如果您使用此方法对应用程序进行签名,则需要将生成的密钥库指纹包含在API凭证中。

在项目浏览器上,右键单击您的应用程序,然后select打开模块设置。

打开模块设置|的屏幕截图应用程序|签署|配置

我发现把这个.jks文件放在我的项目的/app目录下会让你不那么困惑。 在任何情况下运行这条线。

 keytool -list -v -keystore /home/user/keystores/android.jks 

系统会提示您input密码。 不知道是Key Password还是Store Password因为我的Store Password是一样的。 :|

控制台将吐出一堆证书指纹。 拿起SHA1,在Google API开发人员控制台上将其打入您的API凭证。 您将需要为Android客户端OAuth 2.0 client IDsinput它,即使您没有在您的应用程序中实际使用该OAuth 2.0 client IDs 。 如果您正在使用其他API的API,则将相同的SHA1也放在API keys下的相应密钥凭证中。

首先检查你的释放sha1键是否正确。 但是,如果仍然不能正常工作,并且您使用的是Google Play服务8.4.0(iecompile'c​​om.google.android.gms:play-services:8.4.0'),则可以通过修改GoogleSignInOption对象来解决问题。 代替:

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .requestIdToken("YOUR_WEB_API_ID.apps.googleusercontent.com") .build(); 

你必须使用:

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(new Scope(Scopes.PLUS_LOGIN)) .requestScopes(new Scope(Scopes.PLUS_ME)) .requestEmail() .build(); 

这解决了错误返回statusCode = INTERNAL_ERROR OR statusCode =错误12501 OR statusCode =错误12500.那么这个gso对象可以用来创buildGoogleApiClient,如下所示:

  mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this, this) .addApi(Auth.GOOGLE_SIGN_IN_API,gso) // .addApi(Plus.API, null) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) // .addScope(Plus.SCOPE_PLUS_LOGIN) .build(); 

这是一个新的。 我试图用6个小时的时间在我的公司的Google Apps域名上用idlogin模拟器,但是没有成功,得到12501错误。 在预感,我试过我个人的Gmail身份证,它的工作。 同上,如果我用我的公司身份证在我的手机上试用。 事实certificate,模拟器没有适当的移动设备pipe理设置,以允许我的公司IDlogin。

所以如果我想用这个公司ID在模拟器上testing,我必须安装Google Play商店,然后安装MDM软件,并configuration它。

从我对这个错误的奇怪的经验,我可以说,你也需要尝试重新启动你的手机,以摆脱这个错误:)我实施谷歌login使用G Suite帐户有一个设备的政策分配通过谷歌pipe理。 所以在第一个login时,它需要安装Device Policy应用程序。 所有后来的步骤完成后,只是抛出12501错误。 同一时间,同一个应用在其他手机上工作正常。 所以只有重启帮助。 但帮助

尽pipe在这个问题上已经有了许多有回报的答案,但我仍然努力去理解这个逻辑。 所以,我拿出我的研究。

要获得SHA-1,请在terminal中运行:

 keytool -exportcert -keystore path-to-debug-or-production-keystore -list -v 

关于OAuth 2.0 client IDs

  • networkingOAuth(在应用程序中,这被用作server_client_id
  • android的OAuth(这需要使用正确的包名和签名证书指纹SHA-1创build )。

如果您正在使用不同的密钥库进行debugging和发布,则需要使用相应的软件包名称SHA-1创build单独的OAuth 2.0 client IDs

您可以在这里创build或编辑您的OAuth 2.0 client IDs https://console.developers.google.com/apis/credentials?project=

  1. 导航到您的应用程序。
  2. 如果您已经安装了Android版OAuth,请点击其名称并查看软件包名称SHA-1

我们可以通过将全局(本地,不在项目中)的gradle.properties的keystore详细信息保存在build.gradle ,使用相同的keystore进行debugging和发布。

 def key_alias = "" def key_password = "" def store_file = "" def store_password = "" try { key_alias = YOUR_KEY_ALIAS key_password = YOUR_KEY_PASSWORD store_file = YOUR_KEYSTORE_PATH store_password = YOUR_KEYSTORE_PASSWORD } catch (Exception exception) { throw new IllegalStateException('Failed to find key store details. Social Login is disabled'); } android { signingConfigs { config { keyAlias key_alias keyPassword key_password storeFile file(store_file) storePassword store_password } } buildTypes { debug { signingConfig signingConfigs.config // ... } release { signingConfig signingConfigs.config // ... } } } 

你可以使用下面的代码片段

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_GOOGLE_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (result.isSuccess()) { // ... } else if (result.getStatus().getStatusCode() == CommonStatusCodes.NETWORK_ERROR) { // No internet connection } else if (result.getStatus().getStatusCode() == CommonStatusCodes.DEVELOPER_ERROR) { // Wrong server OAuth key(server_client_id) } else if (result.getStatus().getStatusCode() == 12501) { // Wrong app signing-certificate fingerprint SHA1 } else { Log.e("Google sign in error", result.getStatus().toString()); } } } 

注意:如果您在生成configuration文件时只启用了Google Sign-In,则不需要在项目中添加google-servies.json文件(生成文件将执行必要的configuration步骤)。

请尝试以下步骤:

  1. 克隆以下项目https://github.com/googlesamples/google-services

  2. 请按照https://developers.google.com/identity/sign-in/android/start上的指南进行操作;

  3. 使用Web客户端(由Google服务自动创build)并将其添加到requestIdToken(…)

     GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .requestIdToken("YOUR_WEB_API_ID.apps.googleusercontent.com") .build(); 
  4. 确保您使用的是添加到Google项目中的相同密钥库。 例如,如果您使用以下命令来生成SHA-1密钥

     keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore 
  5. 然后将下面的代码添加到android {…}中的app / build.gradle文件中[解决了我的问题]

     signingConfigs { debug { storeFile file("/home/ashwin/.android/debug.keystore") storePassword "android" keyAlias "androiddebugkey" keyPassword "android" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { signingConfig signingConfigs.debug } } 

注意:您的keyPassword和keyAlias应该与生成SHA-1证书时使用的一样。

1.在您的gradle文件中指定signingConfigs

 signingConfigs { config { keyAlias 'appalias' keyPassword 'hunter123' storePassword 'hunter123' storeFile file('path/to/keystore.jks') } } 

2.转到项目结构中的构buildtypes(在Android Studio中)并指定signingConfigs来“configuration”

现在清理你的项目并重新构build。 它应该工作。

如果上述不起作用,那么下面是你的最后一招。
尝试第一步,build立和检查。 如果它不工作,请转到下一步,然后再尝试重新构build。

  1. build立一个签名的apk(记住密码选中)。
  2. 在签署之前检查密钥库文件的文件名,以及在签署apk文件时(android工作室)给出的文件名。
  3. 在您的设备上安装已签名的apk。
  4. 等五分钟。
  5. 尝试唱歌谷歌。 如果12501还要再等5分钟。 在做这个命中gradle同步。
  6. 再试一次。 它应该工作。

由于该应用请求Google从Web视图login,因此我们需要创buildWeb应用程序身份validation客户端ID v2.0

  1. 转到Google API凭证

    从左上angularselect你的Android项目

    2

  2. 点击创build凭证 – > OAuth客户端ID – >selectWeb应用程序

  3. 点击确定

  4. 现在,如果您已将Android Studio与Firebase同步(login),只需重新生成该项目,否则下载更新的google-services.json文件并replace现有的文件。

    它应该工作正常。

我也有同样的问题,解决如下:

  1. 我曾经删除以前认为的SHA1,并创build并设置新的SHA1。

  2. 生成新的google-services.json并设置到我的应用程序目录

  3. 我正好使用谷歌开发者代码

  4. 运行该项目后,我的result.isSucces()返回true

作为总结,删除旧的sha1并创build新的sha1并下载新的google-services.json

我正面临同样的12501 status错误。 这是由于APK和debuggingAPK的SHA-1不匹配。

  1. 做一个签名的APK。 要签名APK,请select用于创buildSHA-1的密钥库的现有path。 例如/.android/debug.keystore
  2. 给别名:androiddebugkey
  3. storepass和keypass:android。