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 是同一個設定問題。意思是,要求登入的應用程式(套件名稱和這個版本的簽署憑證 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 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)列出的常見設定錯誤來源是:建構版本的簽署 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_in 7 在 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。

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

資料來源

所有文章 →