解决 Google 登录错误 10 和 28444:Developer console is not set up correctly
旧版 Google 登录 SDK 的 ApiException: 10 和 Credential Manager 的 [28444] Developer console is not set up correctly 是同一个配置问题。意思是,请求登录的应用(软件包名称和这个 build 的签名证书的 SHA-1)或应用传入的 Web 客户端 ID,与项目中注册的值不一致。要改的是注册的值,而不是代码。请先确认 Firebase 中有当前运行的 build 的签名密钥 SHA-1。
要点
- 名字不同,其实是同一个错误。10 是旧版 SDK 的
DEVELOPER_ERROR,28444 则是 Credential Manager 返回的同一含义的消息。原因在于软件包名称、签名 SHA-1、Web 客户端 ID 中的某一项。区分错误 - 注册正在运行的 build 的签名密钥 SHA-1。调试密钥、上传密钥和 Google Play 的应用签名密钥各不相同。各 build 的 SHA-1
serverClientId要填 Web 客户端 ID。不是 Android 客户端 ID。要填的值- 旧版 SDK 已于 2026 年 8 月移除。在 Credential Manager 中,同样的配置错误有时看起来像是用户取消了操作。迁移时
区分错误
| 错误 | 出现位置 | 含义 |
|---|---|---|
ApiException: 10 | 旧版 Google Sign-In for Android | DEVELOPER_ERROR。应用配置有误。 |
[28444] Developer console is not set up correctly. | Credential Manager。在 Flutter 的 google_sign_in 7 中为 GoogleSignInExceptionCode.unknownError | 文档中没有这个错误代码。正如消息所说,OAuth 配置与应用不匹配。 |
| 用户未取消却返回取消 | Credential Manager(GetCredentialCancellationException,Flutter 中为 canceled) | 配置错误有时会被报告为取消。 |
ApiException: 12500 | 旧版 Google Sign-In for Android | 根据 Firebase 文档,原因是没有添加支持电子邮件地址,或者缺少 SHA 密钥。 |
NoCredentialException | Credential Manager | 不是配置问题。设备上没有 Google 账号,或者设置成了只显示登录过此应用的账号(见下文)。 |
前三种的原因相同。Flutter 插件的文档(google_sign_in_android)列出的常见配置错误来源是:build 的签名 SHA 缺失或有误、服务器端注册的软件包名称有误、serverClientId 缺失或有误。请按这个顺序检查。
这个 build 的签名密钥 SHA-1
Google 通过软件包名称和 APK 签名证书的 SHA-1 来识别请求登录的应用。软件包名称就是 build.gradle 中的 applicationId(包括 build 类型添加的后缀),必须与 Firebase 中注册的 Android 应用一致。签名则取决于应用的安装方式。
| 安装的 build | 签名所用的密钥 | 查看 SHA-1 |
|---|---|---|
| 从 Android Studio 运行的调试 build | 这台电脑的调试密钥库(每台电脑都不同) | signingReport 中的 debug 条目 |
| 自己签名并安装的发布 build | 你的上传密钥(发布密钥) | signingReport 中的 release 条目 |
| 从 Google Play 安装的应用(所有轨道) | Google 持有的应用签名密钥 | Play Console 的管理 Play 应用签名(Manage Play app signing)页面 |
| 通过内部应用分享(Internal app sharing)安装的应用 | Play 的内部测试证书 | Play Console 内部应用分享页面上的内部测试证书(Internal test certificate) |
# Every build variant's signing key, from the project root
./gradlew signingReport
# The debug keystore (password: android)
keytool -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore
# The certificate that signed an APK or AAB you already have
keytool -printcert -jarfile app-release.aab在 Firebase 控制台的项目设置(Project settings) > 常规(General) > 您的应用(Your apps)中,把找到的 SHA-1 添加到 Android 应用的 SHA 证书指纹(SHA certificate fingerprints),然后重新下载 google-services.json 替换原来的文件。Firebase 会为这个指纹创建 Android OAuth 客户端。把用到的密钥全部注册好,无论通过哪种途径安装都能登录。
- 如果自己安装没问题,从 Play 安装却失败,就是缺少应用签名密钥。Play 会用 Google 持有的应用签名密钥重新签名,而不是你的上传密钥。
- 新创建的应用默认采用量子就绪(quantum-ready)签名,由 Play 用三个密钥签名。这时 Play Console 帮助会提示你向 API 提供商注册全部三个指纹。
- 同一对软件包名称和 SHA-1 在所有 Firebase 和 Google Cloud 项目中只能注册到一个项目。如果开发和生产分别使用不同的项目,请为每个 build 设置不同的软件包名称。
serverClientId 要填 Web 客户端 ID
serverClientId 要填 Google Cloud 项目中 Web 应用类型的 OAuth 客户端 ID。这个值会用作 Google ID 令牌的受众(audience),所以不能填 Android 客户端 ID。在 Firebase 项目中,它就是 google-services.json 里 client_type 为 3 的条目,google-services 插件会把它生成为 R.string.default_web_client_id。
// Android (Kotlin): the Sign in with Google button
val buttonOption = GetSignInWithGoogleOption.Builder(
serverClientId = getString(R.string.default_web_client_id),
).build()
// Android (Kotlin): the bottom sheet, offering every account on the device
val sheetOption = GetGoogleIdOption.Builder()
.setServerClientId(getString(R.string.default_web_client_id))
.setFilterByAuthorizedAccounts(false)
.build()
// Flutter (google_sign_in 7), without google-services.json
await GoogleSignIn.instance.initialize(
serverClientId: 'YOUR_WEB_CLIENT_ID.apps.googleusercontent.com',
);- Flutter 的
google_sign_in7 在google-services.json中有 Web 客户端条目时,即使不传serverClientId也会读取这个值。如果没有这个条目,请在 Firebase 项目中添加一个 Web 应用,然后重新下载该文件。在 Android 上不会用到clientId。 - 如果从 6.x 升级到 7 之后才开始出现 28444,请怀疑是
serverClientId的问题。Flutter 团队解释说,6.x 使用的旧版 SDK 并不总是检查这个值,所以错误的值也可能曾经正常工作(flutter/flutter #174319)。
从旧版 SDK 迁移到 Credential Manager 时
旧版 Google Sign-In for Android 的 API 已在 play-services-auth 22.0.0(2026 年 8 月 26 日)中移除。使用这个版本或更高版本时,基于 GoogleSignInClient 编写的登录代码无法编译,所以请迁移到 Credential Manager。
| 旧版 SDK | Credential Manager |
|---|---|
GoogleSignInClient 的登录界面 | GetSignInWithGoogleOption(按钮)或 GetGoogleIdOption(底部动作条) |
silentSignIn() | 在 GetGoogleIdOption 中设置 setFilterByAuthorizedAccounts(true)、setAutoSelectEnabled(true) |
requestIdToken(webClientId) | 在 serverClientId 中填同一个 Web 客户端 ID |
signOut() | clearCredentialState() |
ApiException: 10 | [28444] Developer console is not set up correctly 或取消 |
setFilterByAuthorizedAccounts的默认值是true。对从未登录过此应用的用户,会出现NoCredentialException,所以在注册和首次登录时请设为false,或者使用按钮流程。- 在模拟器上要先登录 Google 账号。请使用带有 Google APIs 的系统映像。设备上没有账号时会出现
NoCredentialException。
资料来源
- CommonStatusCodes.DEVELOPER_ERROR、Play 服务版本说明:10 的含义、Google Sign-In API 的移除
- 从旧版 Google Sign-In 迁移、用 Credential Manager 实现 Sign in with Google、Credential Manager 问题排查
- 在 Android 上使用 Google 账号进行身份验证(Firebase)、Firebase Android 问题排查 FAQ、google-services 插件、SHA 指纹和 OAuth 客户端(Firebase 帮助)
- OAuth 客户端(Google Cloud 帮助)、获取 SHA-1、Play 应用签名、内部应用分享
- google_sign_in_android、flutter/flutter #174319(28444 的报告)、Sign in with Google Codelab
