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 が、プロジェクトに登録されている値と一致していないという意味です。直すのはコードではなく、登録内容です。まず、いま実行しているビルドに署名した鍵の SHA-1 が Firebase に登録されているか確認してください。

要点

  • 名前が違うだけで、同じエラーです。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 AndroidFirebase のドキュメントによると、サポート メールアドレスが設定されていないか、SHA 鍵が抜けています。
NoCredentialExceptionCredential Manager設定の問題ではありません。デバイスに Google アカウントがないか、このアプリにログインしたことのあるアカウントだけを表示する設定になっています(後述)。

最初の 3 つは原因が同じです。Flutter プラグインのドキュメント(google_sign_in_android)は、設定エラーのよくある原因として、ビルドの署名 SHA の登録漏れや誤り、サーバー側に登録したパッケージ名の誤り、serverClientId の指定漏れや誤りを挙げています。この順に確認してください。

このビルドに署名した鍵の SHA-1

Google は、ログインをリクエストしたアプリを、パッケージ名と APK に署名した証明書の SHA-1 で識別します。パッケージ名は build.gradle の applicationId(ビルドタイプで付けた接尾辞を含む)で、Firebase に登録した Android アプリのものと同じである必要があります。署名は、アプリをどうインストールしたかによって変わります。

インストールしたビルド署名した鍵SHA-1 の確認先
Android Studio から実行したデバッグビルドこのコンピュータのデバッグ キーストア(コンピュータごとに異なる)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

見つけた SHA-1 を、Firebase コンソールのプロジェクトの設定(Project settings) > 全般(General) > マイアプリ(Your apps)で、Android アプリの SHA 証明書フィンガープリント(SHA certificate fingerprints)に追加し、google-services.json をダウンロードし直して置き換えます。Firebase が、そのフィンガープリントに対応する Android OAuth クライアントを作成します。使う鍵をすべて登録しておけば、どの経路でインストールしてもログインできます。

  • 自分でインストールすると動くのに、Play から入手すると失敗するなら、アプリ署名鍵の登録が抜けています。Play は、アップロード鍵ではなく、Google が保持するアプリ署名鍵でアプリを再署名します。
  • 新しく作成したアプリは、デフォルトで量子対応(quantum-ready)の署名になり、Play が 3 つの鍵で署名します。その場合 Play Console ヘルプは、3 つのフィンガープリントをすべて API プロバイダに登録するよう案内しています。
  • 同じパッケージ名と SHA-1 の組み合わせは、Firebase と Google Cloud のすべてのプロジェクトを通じて、1 つのプロジェクトにしか登録できません。開発用と本番用でプロジェクトを分けているなら、ビルドごとにパッケージ名を変えてください。

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 が発生します。

出典

すべての記事 →