新的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一个新的(我认为文档是多余的或什么的)
正如它所说的那样,只有这一个,你必须使用它作为方法requestIdToken或requestServerAuthCode的参数。
忘记在这个方法中使用Android OAuth ID,因为那样你会得到所有的丑陋的状态码响应12501。
我认为主要的问题是这个文档有点混乱。 或者,也许是因为您必须创build两个OAuth ID才有点奇怪。
所以作为一个总结, 您需要两个OAuth ID,一个用于android,一个用于web应用程序,您必须在正确的位置设置每个OAuth ID。
我一直在为此挣扎,浪费了将近一周的时间。
这是我得到它的工作。
- 在AndroidStudio中导入项目
- 为项目创builddebugging密钥库。
- 使用debugging密钥库为项目创buildSHA1签名。
- 使用SHA1签名,在Google Developer Console上注册您的Google Signin应用。
- 在那里生成一个Googleconfiguration文件(放入Android Studio的app文件夹)
- 在Android项目中使用来自OAuth 2.0凭据的Web客户端ID。
- 现在,从Android Studio中生成您的项目的debugging版本(APK)。
- 将设备挂载到您的系统中 – >复制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:
- 按照此处所述创buildconfiguration文件(google-services.json)并放置在/ app项目目录中
- (正如在其他答案中提到)使用Web应用程序客户端ID为
requestIdToken
方法。 - [我的主要问题]签署你的应用程序,如果你在像下面的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。
- 遵循模糊的谷歌文件。
- 将google-services.json放到您的项目目录中
-
设置您的gradle为https://stackoverflow.com/a/35216421/5886475
-
在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用户无关。
- 转到菜单工具 – > Firebase
- 点击将您的应用连接到Firebase,一旦连接成功,它将显示为已连接
- 点击将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错误消失,工作正常!
这些是工作步骤:
- 首先我创build了SHA1debugging密钥并添加到Firebase控制台。 从这里创buildSHA1。
- 从这里创buildweb api和android OAuth 2.0客户端ID
- 从Firebase控制台生成
google-service.json
并放入应用文件夹。 - 把这个代码
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指纹。
- 在您的Firebase控制台上 ,打开您的项目
- 转到参数。 标签一般
- 在这个页面的末尾,有一个字段可以添加指纹SHA-1
- 将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 IDs
input它,即使您没有在您的应用程序中实际使用该OAuth 2.0 client IDs
。 如果您正在使用其他API的API,则将相同的SHA1也放在API keys
下的相应密钥凭证中。
首先检查你的释放sha1键是否正确。 但是,如果仍然不能正常工作,并且您使用的是Google Play服务8.4.0(iecompile'com.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创build应用程序https://developers.google.com/mobile/add?platform=android&cntapi=signin
- 启用谷歌login
- 生成configuration文件。
要获得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=
- 导航到您的应用程序。
- 如果您已经安装了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步骤)。
请尝试以下步骤:
-
请按照https://developers.google.com/identity/sign-in/android/start上的指南进行操作;
-
使用Web客户端(由Google服务自动创build)并将其添加到requestIdToken(…)
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .requestIdToken("YOUR_WEB_API_ID.apps.googleusercontent.com") .build();
-
确保您使用的是添加到Google项目中的相同密钥库。 例如,如果您使用以下命令来生成SHA-1密钥
keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore
-
然后将下面的代码添加到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。
- build立一个签名的apk(记住密码选中)。
- 在签署之前检查密钥库文件的文件名,以及在签署apk文件时(android工作室)给出的文件名。
- 在您的设备上安装已签名的apk。
- 等五分钟。
- 尝试唱歌谷歌。 如果12501还要再等5分钟。 在做这个命中gradle同步。
- 再试一次。 它应该工作。
由于该应用请求Google从Web视图login,因此我们需要创buildWeb应用程序身份validation客户端ID v2.0
-
转到Google API凭证
从左上angularselect你的Android项目
2
-
点击创build凭证 – > OAuth客户端ID – >selectWeb应用程序
-
点击确定
-
现在,如果您已将Android Studio与Firebase同步(login),只需重新生成该项目,否则下载更新的google-services.json文件并replace现有的文件。
它应该工作正常。
我也有同样的问题,解决如下:
我曾经删除以前认为的SHA1,并创build并设置新的SHA1。
生成新的
google-services.json
并设置到我的应用程序目录我正好使用谷歌开发者代码
运行该项目后,我的
result.isSucces()
返回true
作为总结,删除旧的sha1并创build新的sha1并下载新的google-services.json
我正面临同样的12501 status
错误。 这是由于APK和debuggingAPK的SHA-1不匹配。
- 做一个签名的APK。 要签名APK,请select用于创buildSHA-1的密钥库的现有path。 例如
/.android/debug.keystore
- 给别名:androiddebugkey
- storepass和keypass:android。