Google SignIn Unity – Android でログインできない?!

みんな大好きな!のはずの Google SiginIn Unity
前回iOSのビルドが通らなかったり、通ったと思ったら、非推奨APIを使ってるからダメでアップロードできなかったりとなかなかどうしてジャジャ馬なプラグイン。

まあ、得てしてこういったものにはトラブルはつきものなのですが、今回はAndroidでログインできないという現象に苛まれて解決するのに四苦八苦したので誰かのために対処方法を記載しておきます。というか自分のためでもありますが。すぐ忘れちゃうので。


尚、以前にiOS版でビルドを通せなかった時の記事はこちらです。
Google SignIn Unityを使うとiOSでリジェクト

開発環境

Unity 2019.3.15f1

macOS 10.15.5 Catalina

Firebase 6.14.1

Google SignIn Unity 1.0.1

ログインに失敗する

Android版をビルドしてGoogleSignInを試すと割とあっさりログイン画面は表示されます。

ところが、ここからログインした後にFirebaseからエラーが返されてしまい、
なぜか失敗します。そう何度やっても失敗します。ログインできぬ。

Firebase側に返された例外情報から読み解こうとエラーメッセージを表示させて見ればいいんだ!
ということで、エラーログを出すようにしてみます。

 GoogleSignIn.DefaultInstance.SignIn().ContinueWith (task => {
    if (task.IsCanceled) {
      context.Post (_ => {
      Log.d ("{0}: Canceled ", GetType ().Name);
      EndAction (false);
      }, null);

    } else if (task.IsFaulted) {
      context.Post (_ => {
    // ここでログインできなかった理由をログに出力するのを追加。
      Log.d ("{0}: Faulted. error : {1}", GetType ().Name, FirebaseUtil.GetFirebaseException (task.Exception));
      storeLoginFaulted.value = true;
      EndAction (false);
      }, null);

    } else {
      // ログインできたよ
    }
});   

Faulted. error : One or more errors occurred.
”1つ以上のエラーが発生しました。”

・・・いやいや、そんなの見ればわかるし。
だからそのエラーの内容が何なのかわからんって言ってるのに。。。

Status{statusCode=DEVELOPER_ERROR, resolution=null}

こう言う時は、adb logcatを使って、端末に流れるログを見るのが一番。
・・・と言うことで、logcatしてみました。

androidって割といっつも例外が起きてるイメージなのでどれも怪しいですw
まず、原因となるエラーがどれなのかを特定することが肝要。

最初は黄色のFailed to record the consent.の部分かなと思っていたのですが、
このエラーに関する具体的な対処法が探せず一旦別のエラーを探すことにしました。

次に見つけたのが
Calling onResult for callback. result: Status: Status{statusCode=DEVELOPER_ERROR, resolution=null} <null>
です。TokenPendingResultと言うプロセスが何なのか分かりませんが、とりあえずログインアカウント選択後に必ず失敗することから、資格情報を取得できていない可能性があるので、トークンなんたらってのはそれ系の処理を担当してそう。

しかも、DEVELOPER_ERRORと表示されているので、明らかに開発者サイドが悪いと人のせいにしていますね。

とはいえ、このDEVELOPER_ERRORもまた何を意味しているのか全く分かりません。
というかこの手のエラーメッセージは具体的に書いてもらわないとエラーメッセージとしての意味が全くないと思うんだけど。

プログラムのコメントで、a=1; という処理に /* aに1を代入します */ とコメントするぐらい意味がない情報です。

DEVELOPER_ERRORはSHA証明書のフィンガープリントの値が不正を意味する

わかるか!こんなもん!
普通、DEVELOPER_ERRORと表示されて「あー、SHA証明書のフィンガープリントだな!よし来た!」ってならんよ!

このエラーの意味が解ったのは、いろんなGithubのIssuesを徘徊していてたまたま見つけた外人の発言でした。
https://github.com/flutter/flutter/issues/15108
これはflutterでGoogle SignInを実装しようとして、同じようなエラーに遭遇していた人たちのスレッドです。

この発言を受けて、そういえばキーストアのSHA1とSHA256の値を別の値にしていたことに気づいて正しい値をfirebaseのコンソールに登録したところ…

動いた!

これででやっと寝れる。今日は安眠だ!

あとは、Google Play Consoleで、新しいテスト版をアップロードして確認したらOKだということで、ビルド&アップロードし、待ち時間でAmazonのウインドウショッピングを楽しんでいたのですが、配信されたテスト版を実行した結果。

DEVELOPER_ERROR

なんでだよ!もうやだAndroid…

App BundleファイルにするとDEVELOPER_ERRORが発生する

この問題の重要な点は、通常のapkファイルを端末にインストールしても発生せず、
App BundleファイルにするとDEVELOPER_ERRORが発生するという点です。

DEVELOPER_ERRORは上述の通り、SHA1証明書のフィンガープリントが一致しないことに起因するエラーでした。

察しのいい人なら気づくと思いますが、Google Playアプリ署名が有効の場合、
App BundleファイルはGoogleがアプリ署名鍵を使って再署名した後に配信されます。
つまり、Google Play Consoleに登録されている署名証明書のフィンガープリントの値もFirebaseに登録しておかないといけないのです。

アプリ署名が有効になっている場合
このフィンガープリントで再署名される

本当にそうなのか?
インストール済みのアプリからapkを抽出して証明書を確認してみます。

adb devices

で表示されたデバイス名を使って端末にログインしてみます。

adb -s [デバイス名] shell

パッケージリストから目的のパッケージを探します。

pm list packages -f | grep [パッケージ名]

すると、package:アプリのパス=パッケージ名という形式で表示されます。
このアプリのパスにあるapkファイルをPC側に抽出します。

一度端末にログインしているshellから抜け、

adb pull [アプリのパス]

でapkファイルを抽出します。

keytool -list -printcert -jarfaile [apkファイル名]

証明書のフィンガプリントがGoogle Play Consoleの署名と同じか確認

うむ。Google Play Consoleに登録されているフィンガプリントと同じだ!

…ということで、無事ログインできるようになりました!

しかし、この手の記事は探しても全く載っていないので、Unity + Firebase + Google SignIn Unity を使ってる人があまりいないということなんでしょうか?

DEVELOPER_ERROR、こいつは証明書のフィンガプリントが違うよというエラーでしたという話でした。

よかったらフォローしてね!

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    CAPTCHA