Android Studioから直接インストールしたアプリではGoogleログインできるのに、Google Playからインストールしたクローズドテスト版や製品版だけ失敗することがあります。
代表的な症状は次のとおりです。
- Googleアカウントを選択した後に元の画面へ戻る
DEVELOPER_ERRORやエラーコード10が出る- Firebase Authenticationにユーザーが作成されない
- 内部テスト版や製品版だけIDトークンを取得できない
最も多い原因は、Google Playが配信版へ使用するアプリ署名鍵のSHAフィンガープリントが、FirebaseまたはGoogle Cloudへ登録されていないことです。
なぜdebug版だけ動くのか
Googleログインでは、主に次の組み合わせでAndroidアプリを識別します。
- パッケージ名
- 署名証明書
- SHA-1またはSHA-256
- OAuthクライアント
- FirebaseまたはGoogle Cloudプロジェクト
Android Studioのdebug版は、通常debug.keystoreで署名されます。一方、Google Playから配信されるAPKは、Play App Signingのアプリ署名鍵で署名されます。
同じパッケージ名でも署名証明書が異なるため、debug用SHAだけを登録しているとGoogle Play版だけ認証に失敗する可能性があります。
アップロード鍵とアプリ署名鍵を区別する
Play App Signingでは、主に2種類の鍵があります。
| 鍵 | 主な役割 |
|---|---|
| アップロード鍵 | 開発者がAABをPlay Consoleへ提出するときに使用 |
| アプリ署名鍵 | Google Playがユーザーへ配信するAPKへ使用 |
Google Play版の認証設定で重要なのは、通常、アプリ署名鍵の証明書です。
Play Consoleで「アプリ署名鍵の証明書」と「アップロード鍵の証明書」を取り違えないでください。
最短の修正手順
- Play Consoleで対象アプリを開く
- Play App Signingの管理画面を開く
- アプリ署名鍵のSHA-1をコピーする
- 必要に応じてSHA-256もコピーする
- Firebaseの正しいAndroidアプリへ追加する
- Firebase AuthenticationでGoogleプロバイダを有効にする
- Google CloudのOAuthクライアントを確認する
- 最新の
google-services.jsonへ更新する versionCodeを増やして新しいAABを公開する- Google Playから最新版へ更新して再確認する
FirebaseへSHAを追加する
Firebaseコンソールで次の順に進みます。
- 対象プロジェクトを開く
- 「プロジェクトの設定」を開く
- 「全般」の「マイアプリ」へ移動する
- 対象のAndroidアプリを選ぶ
- 「SHA証明書フィンガープリントを追加」を選ぶ
- Play Consoleから取得したSHAを保存する
GoogleログインではSHA-1が重要です。Firebase App Checkや一部のAPI制限ではSHA-256が必要になるため、利用機能の公式手順も確認してください。
パッケージ名を確認する
Firebaseへ登録したパッケージ名と、Google Play版の実際のapplicationIdが一致している必要があります。
android {
defaultConfig {
applicationId = "com.example.app"
}
}
product flavorを使用している場合は、最終的なIDが変わることがあります。
productFlavors {
create("development") {
applicationIdSuffix = ".dev"
}
}
この場合、開発版はcom.example.app.dev、本番版はcom.example.appです。Google Playへ提出した本番版のIDを基準に確認します。
AndroidクライアントIDとWebクライアントID
Googleログインでは、次の2種類を混同しやすくなります。
AndroidクライアントID
パッケージ名とSHA-1の組み合わせでAndroidアプリを識別します。
WebクライアントID
IDトークンのaudienceやサーバークライアントIDとして使用します。Credential ManagerのsetServerClientIdには、通常WebクライアントIDを指定します。
val googleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(false)
.setServerClientId(WEB_CLIENT_ID)
.build()
AndroidクライアントIDをここへ設定すると、認証構成が一致しない場合があります。
google-services.jsonを更新する
SHAやGoogleログインの設定を追加した後は、Firebaseから最新のgoogle-services.jsonを取得します。
一般的な配置場所は次のとおりです。
app/google-services.json
FlutterやReact Nativeでは通常次の場所です。
android/app/google-services.json
別プロジェクトのファイルや古いファイルを使っていないか、project_idとpackage_nameも確認してください。
バックエンドで401になる場合
アプリ側のアカウント選択まで成功し、バックエンドだけ401になる場合は、IDトークンのaudを確認します。
- アプリのWebクライアントID
- Google Cloud上のWebクライアントID
- バックエンドが許可するaudience
これらが一致していなければ、Googleログイン画面は完了してもサーバー側で拒否されます。
修正後の確認
修正後は、次の3種類を分けて確認します。
| ビルド | 主な署名 |
|---|---|
| Android Studioのdebug版 | debug keystore |
| ローカルrelease APK | release鍵・アップロード鍵 |
| Google Play配信版 | Play App Signingのアプリ署名鍵 |
Google Play版を確認するときは、端末へ残った古いAPKではなく、Google Playから最新版へ更新してください。
まとめ
Google Play版だけGoogleログインできない場合は、次を順番に確認します。
- Play Consoleのアプリ署名鍵SHA-1
- Firebaseへ登録したAndroidアプリ
- パッケージ名
- Googleプロバイダの有効化
- Android OAuthクライアント
- WebクライアントID
- 最新の
google-services.json - 最新AABと
versionCode
最初に、アップロード鍵ではなくアプリ署名鍵のSHAを登録しているか確認してください。
一次情報
公式参考資料
Google PlayやFirebaseの画面・要件は変更される場合があります。公開作業の前に、リンク先の最新情報も確認してください。