我正在尝试使用新的Google Play服务8.3获取用户令牌ID,并且如我所述,我传递了服务器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}
并在此处记录GoogleSignInStatusCodes
登录已被用户取消 . 即,用户取消了一些登录分辨率,例如,帐户拣货或OAuth同意 . 常数值:12501
这不是我的情况,因为我已经选择了一个帐户 . 任何想法可能是什么原因?
30 回答
使用 Web application 作为server_client_id而不是Android应用程序
我有完全相同的问题,我找到了解决方案 .
如果您按照此处找到的文档:https://developers.google.com/identity/sign-in/android/start-integrating
第一步告诉您创建配置文件(为您创建OAuth 2.0客户端ID并将其插入google-services.json)
然后,它又说再次创建一个OAuth 2.0客户端ID,但是这次它说你必须为 Web application 做
这是令人困惑的部分! (至少对我而言)因为我只是为Android OAuth创建了客户端ID,而没有为Web应用程序创建一个新的(我认为文档只是冗余或其他)
正如它所说的那样,只有这一个,你必须使用它作为方法requestIdToken或requestServerAuthCode的参数 .
忘记在此方法中使用Android OAuth ID,因为这样您将始终获得丑陋的状态代码响应12501 .
我认为主要问题是文档对此有点混乱 . 或者也许是因为你必须创建两个OAuth ID这一事实有点奇怪 .
所以作为总结, you need TWO OAuth IDs, one for android and one for web application, and you have to set each one in the correct place.
我正在努力解决这个问题并浪费了将近一周的时间 .
This is how I got it worked.
在AndroidStudio中导入项目
为项目创建调试密钥库 .
使用debug keystore为项目创建SHA1签名 .
使用SHA1签名,在Google Developer Console上注册Google Signin应用 .
在那里生成一个Google配置文件 . (放入Android Studio的app文件夹)
在Android项目中使用OAuth 2.0凭据中的Web客户端ID .
Now, from Android Studio, generate debug build(APK) of your project.
Mount the device in your system -> copy this signed debug version of APK and install it.
最后三个 steps 6, 7 and 8 ,是你真正需要照顾的 . If you directly run the project then APK is not actually signed with the debug keystore and google does not recognise it at all.
我有同样的问题,在研究解决方案之后,它恢复了server_client_id包含一些不正确的值,或者你的google_services.json没有包含oauth_client,其中client_id已在你的密钥库中注册 .
R.string.server_client_id
使用 Web Application 的OAuth 2.0客户端ID . Android 的OAuth客户端ID在google_services.json中使用通常我们使用2个密钥库,1个使用调试密钥库,1个使用签名密钥库进行发布 . 因此,如果我们想要在调试和发布模式下,请为Android注册OAuth客户端ID两次,1使用调试密钥库中的SHA1和来自已签名密钥库的1来发布 .
我的google_services.json中的一个小例子
我得到了同样的问题,这是因为我创建了Android应用程序类型的客户端ID
相反,我删除了它并创建了Web应用程序类型的客户端ID,我摆脱了这个问题 .
只是弄清楚如何解决这个...我在尝试运行我的应用程序的调试版本时遇到此错误...要解决此问题,请在开发人员控制台上以及在google-services上为调试应用程序添加凭据以.json .
这为我修好了!
我有同样的问题,我解决了以下解决方案:
按here所述创建配置文件(google-services.json)并放入/ app项目目录
(如其他答案中所述)使用
requestIdToken
方法的Web应用程序客户端ID .[我的主要问题]如果您在以下调试模式下工作,请为您的应用签名:
buildTypes {
发布
debug
}
现在我明白了 .
所以首先你必须按照上面的答案说:
在Google Developers Console中为Web应用程序创建OAuth客户端ID,并在
requestIdToken()
中使用它(删除状态代码12501)如果您为 生产环境 哈希密钥创建了Android OAuth客户端ID,请为您的调试哈希密钥创建新的Android OAuth客户端ID,并将其集成到您的google-services.json中 . (摆脱状态代码12500)
No longer valid 这是最后一部分:3 . 你不能打电话给
requestIdToken()
和requestEmail()
一下子 . 至少在我的情况下,我通过删除requestEmail()
摆脱Result: Status{statusCode=INTERNAL_ERROR, resolution=null}
.祝你好运......
就我而言,我还必须检查调试SHA-1是否已添加为有效的OAuth Android客户端 .
我有同样的问题,我注意到当我的
server_client_id
包含一些不正确的值时,返回了12501代码 .由于没有详细的消息,并且此错误代码的文档相当差,我不知道您的问题是否与我的问题相同 .
我的应用程序基于this example(类IdTokenActivity)的Android代码 . 为了使它工作,我还需要integrate Google sign-in进入我的应用程序:
生成了启用了Google登录的json配置文件
将Google插件和依赖项添加到我的gradle文件中
为此应用创建了OAuth客户端ID,并将其保存在我的项目中
server_client_id
你的apk是否处于调试模式?我认为它只适用于签名的apk .
按照模棱两可的谷歌文档 .
将google-services.json放到项目目录中
将您的gradle设为https://stackoverflow.com/a/35216421/5886475
在string.xml中设置server_client_id . 这是你的 web client id 不是android客户端
我遇到的问题是我生成的SHA-1和不正确的别名一样 . 别名 MUST BE androiddebugkey . 所以我已将Android OAuth ID放在google-service.json文件中 . 我已将Web客户端ID放入requestIdToken() . 在我的具体情况下,我用 androiddebugkey 别名生成了SHA-1 .
google-services.json :
Signing part:
代替
R.string.server_client_id
,只需使用R.string.default_web_client_id
.将 google-services.json 文件复制到应用程序时,它会自动创建此字符串值 . 您无需将密钥从google-services.json复制到string.xml它对我有用 .
我通过点击Android Studio中的Firebase支持解决了这个问题,这可能与非Firebase用户无关 .
转到菜单工具 - > Firebase
点击将您的应用程序连接到Firebase,一旦连接成功,它将以绿色显示为已连接
点击添加Firebase身份验证到您的应用按钮,它也将变为绿色 .
注意:拥有大量答案清单肯定证实了一件事 . 谷歌需要更新并保持文档的万无一失 .
如果以上选项都不起作用,请检查app build.gradle中的applicationId是否与包名相同 .
显然首先检查你的释放sha1键是否正确 . 但如果它仍然不起作用并且你使用谷歌播放服务8.4.0(即编译'com.google.android.gms:播放服务:8.4.0'),可以通过修改GoogleSignInOption对象来解决问题 . 代替:
你必须使用:
这解决了返回statusCode = INTERNAL_ERROR或statusCode = Error 12501 OR statusCode = Error 12500的错误 . 然后这个gso对象可用于创建GoogleApiClient,如下所示:
不知道为什么但是android studio中的SHA1会自动更改,这就是我收到此错误的原因 . 为了解决这个问题,我用我的android studio的新SHA1更新了我的firebase项目设置的SHA1,它又开始工作了 .
在我的情况下,我在Google APIs Console上的
Client ID for Android
的凭据仅包含我发布的签名APK的SHA-1 . Android Studio使用默认的调试密钥库来签署我的调试版本,在这种情况下,调试密钥库SHA-1与Android客户端SHA-1不匹配 . 我的解决方案是使用release keystore简单地签署调试版本 .在Android Studio中,
Build/Edit Build Types...
,然后选择您的调试版本类型,并确保将签名配置设置为您的版本证书 .我遇到了同样的问题和错误 12501 以及上面没有对我不起作用 .
我的问题是我使用为我生成的谷歌默认网络API . 在创建我自己的web api错误消失后工作正常!
这些是工作步骤:
首先我创建了SHA1调试密钥并添加到 Firebase 控制台 . 从here创建SHA1 .
从here创建web api和android OAuth 2.0客户端ID
从 Firebase 控制台生成
google-service.json
并放入app文件夹 .把这段代码放到
GoogleSignnOption
像这样:
tip 1: 我发现您应该创建Android和Web应用程序客户端ID才能工作 .
tip 2: 如果你像我一样来自伊朗,你可以从谷歌获得用户不能
AuthWithGoogle
,auth.signInWithCredential(credential)
中的结果将fail
,你必须使用一些代理返回true .这是github中FireBaseAuthDemo的完整工作源:
希望能帮忙
如果您使用 debug keystore 来构建项目,则需要在 Firebase Console 上添加 debug.keystore 的SHA-1指纹 .
在 Firebase Console 上,打开您的项目
转到参数 . 标签 General
在本页末尾,有一个字段要添加 Fingerprint SHA-1
将SHA-1粘贴到控制台字段中 .
要获取debug.keystore的SHA-1:
Mac/Linux :
Windows :
https://developers.google.com/android/guides/client-auth
就这样 !
按照Google对Automatically signing your app的说明后,我也遇到了这个问题 . 如果您使用此方法对应用程序进行签名,则需要在API凭据中包含生成的密钥库指纹 .
我发现将
.jks
文件放在项目的/app
目录中并不那么令人困惑 . 无论如何在它上面运行这一行 .系统将提示您输入密码 . 不确定它是
Key Password
还是Store Password
因为我的是相同的 . :|控制台会吐出一堆证书指纹 . 获取SHA1并将其打入Google API Developer's Console的API凭据 . 您需要为Android客户端
OAuth 2.0 client IDs
输入它,即使您实际上并未在应用中使用该client_id . 如果您正在使用其他API for android,请将相同的SHA1放在API keys
下的相应密钥凭据中 .这是一个新的 . 我尝试使用来自我公司Google Apps域的ID在模拟器上登录6个小时,但无济于事,收到12501错误 . 在预感,我尝试了我的个人Gmail邮件,它工作 . 如果我用我的公司ID尝试使用手机,也可以 . 事实证明,模拟器没有适当的移动设备管理设置来允许我的公司ID登录 .
因此,如果我想在具有此公司ID的模拟器上进行测试,我必须安装Google Play商店,然后安装MDM软件并进行配置 .
根据我对此错误的奇怪体验,我可以说您还需要尝试重新启动手机以摆脱此错误:)我使用G Suite帐户实施了Google登录,其中包含通过Google管理员分配的设备政策 . 所以在第一次登录时需要安装Device Policy应用程序 . 完成所有后续步骤后,它只是抛出12501错误 . 同一个应用程序在其他手机上正常工作 . 所以只有重启才有用 . 但帮助
尽管在这个问题中已经存在许多赞成的答案,但我仍然难以理解逻辑 . 所以,我想出了我的研究成果 .
使用正确的 package name 和签名证书指纹创建应用 SHA-1 https://developers.google.com/mobile/add?platform=android&cntapi=signin
启用Google登录
生成配置文件 .
要获得SHA-1,请在终端中运行:
关于
OAuth 2.0 client IDs
网络的OAuth(在应用程序中用作
server_client_id
)OAuth for android(这需要使用正确的 package name 和签名证书指纹 SHA-1 创建) .
您可以在这里创建或编辑
OAuth 2.0 client IDs
https://console.developers.google.com/apis/credentials?project=导航到您的应用 .
如果您已经拥有适用于Android的OAuth,请单击其名称并检查包名称和SHA-1 .
我们可以使用相同的密钥库进行调试和发布,方法是将密钥库详细信息保存在全局(本地,而不是内部项目)
gradle.properties
中,并在build.gradle
中获取,如下所示 .您可以使用以下代码段
请尝试以下步骤:
克隆以下项目https://github.com/googlesamples/google-services
按照指南https://developers.google.com/identity/sign-in/android/start
使用Web客户端(由Google Service自动创建)并将其添加到requestIdToken(...)中
注意:您的keyPassword和keyAlias应与生成SHA-1证书时使用的相同 .
1.Specify signingConfigs in your gradle file
2.Go to Build Types in Project Structure (in Android Studio) and specify signingConfigs to "config"
现在 clean 您的项目并再次构建 . 它应该工作 .
如果上述方法不起作用,则以下是您的最后选择 .
尝试第一步,构建并检查 . 如果它不起作用,请转到下一步并再次尝试构建 .
构建一个签名的apk(记住密码已检查) .
在签名之前检查密钥库文件的文件名,并在签署apk时放弃(在android studio中) .
在您的设备中安装已签名的apk .
等待五分钟 .
尝试在谷歌唱歌 . 如果仍然12501即将到来等待五分钟 . 这样做会打到gradle sync .
再试一次 . 它应该工作 .
由于应用程序要求Google从Web视图登录,我们需要创建Web应用程序auth客户端ID v2.0
从左上角选择您的Android项目
2
单击“创建凭据 - > OAuth客户端ID - >选择Web应用程序”
单击“确定”
现在,如果您已同步Android Studio和Firebase(已登录),只需重建项目,否则请下载更新的 google-services.json 文件并替换现有文件 .
它应该工作正常 .
我也有同样的问题,解决方法如下:
as summary, delete old sha1 and create new sha1 and download new google-services.json
我面临同样的
12501 status
错误 . 这是由于发布APK和调试APK的SHA-1不匹配 .制作已签名的APK . 要对APK进行签名,请选择用于创建SHA-1的密钥库的现有路径 . 例如
/.android/debug.keystore
给别名:androiddebugkey
storepass和keypass:android .