Firexport博客

解决 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 AndroidDEVELOPER_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 密钥。
NoCredentialExceptionCredential 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_in 7 在 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。

旧版 SDKCredential 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。

资料来源

全部文章 →