解決 Google 登入錯誤 10 和 28444:Developer console is not set up correctly
舊版 Google 登入 SDK 的 ApiException: 10 和 Credential Manager 的 [28444] Developer console is not set up correctly 是同一個設定問題。意思是,要求登入的應用程式(套件名稱和這個版本的簽署憑證 SHA-1)或應用程式傳入的網頁用戶端 ID,與專案中註冊的值不符。要改的是註冊的值,而不是程式碼。請先確認 Firebase 中有目前執行中版本的簽署金鑰 SHA-1。
重點整理
- 名稱不同,其實是同一個錯誤。10 是舊版 SDK 的
DEVELOPER_ERROR,28444 則是 Credential Manager 傳回的同義訊息。原因在於套件名稱、簽署 SHA-1、網頁用戶端 ID 其中之一。區分錯誤 - 註冊執行中版本的簽署金鑰 SHA-1。偵錯金鑰、上傳金鑰和 Google Play 的應用程式簽署金鑰都不一樣。各版本的 SHA-1
serverClientId要填網頁用戶端 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)列出的常見設定錯誤來源是:建構版本的簽署 SHA 缺漏或錯誤、伺服器端註冊的套件名稱錯誤、serverClientId 缺漏或錯誤。請依這個順序檢查。
這個版本的簽署金鑰 SHA-1
Google 透過套件名稱和 APK 簽署憑證的 SHA-1 來辨識要求登入的應用程式。套件名稱就是 build.gradle 中的 applicationId(包括建構類型加上的後綴),必須與 Firebase 中註冊的 Android 應用程式一致。簽署則取決於應用程式的安裝方式。
| 安裝的版本 | 簽署所用的金鑰 | 查看 SHA-1 |
|---|---|---|
| 從 Android Studio 執行的偵錯版本 | 這台電腦的偵錯 KeyStore(每台電腦都不同) | signingReport 中的 debug 項目 |
| 自行簽署並安裝的發布版本 | 你的上傳金鑰(發布金鑰) | 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 專案中只能註冊在一個專案。如果開發和正式環境分別使用不同的專案,請為每個建構版本設定不同的套件名稱。
serverClientId 要填網頁用戶端 ID
serverClientId 要填 Google Cloud 專案中網頁應用程式類型的 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中有網頁用戶端項目時,即使不傳serverClientId也會讀取這個值。如果沒有這個項目,請在 Firebase 專案中新增網頁應用程式,然後重新下載檔案。在 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 中填同一個網頁用戶端 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
