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 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 アカウントがないか、このアプリにログインしたことのあるアカウントだけを表示する設定になっています(後述)。 |
最初の 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_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
