Flutter+SupabaseでAndroid Google認証の触りだけやってみる備忘録

参考
割と新しいめの記事だけど、SupabaseのGoogle設定のUIが少し違うので躓いた...

ほぼ参考記事の順番にやる。
一旦Androidだけで動作が見れればよしとする。
なので、iOSの設定はスキップ。
keystoreの格納場所
コマンドで生成したdebug.keystore
がandroid/
に設置されていたらandroid/app/
にmvしておく
GPTに聞いたらapp/
にあればbuild.gradleで直接指定不要らしいけど、android/
でも大丈夫なのかもしれない(未確認)
ただ、個人的にもandroid/
よりandroid/app/
のほうが好きなのでandroid/app/
mvした。
Google Cloudコンソール
Webアプリはなし、iOS、Androidでの実装だけだとしても、「ウェブアプリケーション」用のクライアントIDの作成が必須なので注意。
公式ドキュメントにも書いてあったのに見逃してた。

Androidでエラーがでる
PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null, null)
上記エラーで検索すると、「だいたいAndroidのSHA-1が間違ってる、設定できていない」
という内容が出てきた。
念の為、debug.keystore
のSHA-1
とのSHA-1 証明書のフィンガープリント
の値をチェックする。
debug.keystoreはこれで出力できる
$ cd android
$ ./gradlew signingReport
↑ただし、この./gradlew signingReport
はAndroidのbuild.gradleにflutter build時など環境変数の注入が前提の作りになっていると、Android単体でコケてしまう場合があるので注意。
$ ./gradlew signingReport
FAILURE: Build failed with an exception.
* Where:
Build file '/hogehoge/android/app/build.gradle' line: 22
* What went wrong:
A problem occurred evaluating project ':app'.
> Could not get unknown property 'dartDefines' for project ':app' of type org.gradle.api.Project.
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.
このプロジェクトはdart-define-from-fileで環境変数を注入して当て込みまくってるbuild.gradleで発生したエラー
なので、どうしようもない場合は、CursorやClaudeなどに頼んでデフォルト値のハンドリングを追加してもらうか、このコマンドを叩く際だけ固定値入れておけば良い。
滅多に叩かないコマンドなので固定値いれてgradlewが実行できるようにするくらいで良いと思う。
取り敢えず一時的に直して、$ ./gradlew signingReport
を叩いて正常に出力されるようになったので、SHA-1
の値を確認...
どうやら違っていたようで、GC上のAndroidのクライアントID設定のSHA-1
を正しい値に設定し直したらGoogle認証通った。
めでたし。

認証処理
参考記事だとGoogleSignIn
のインスタンス生成時にOS判定でだし分けてどちらもclientId
に入れていたけど、このandroidClientId
はいらないっぽい?
final GoogleSignIn googleSignIn = GoogleSignIn(
clientId: Platform.isAndroid ? Env.androidClientId : Env.iosClientId,
serverClientId: Env.webClientId,
);
公式Docだとこうなってた。
/// TODO: update the Web client ID with your own.
///
/// Web Client ID that you registered with Google Cloud.
const webClientId = 'my-web.apps.googleusercontent.com';
/// TODO: update the iOS client ID with your own.
///
/// iOS Client ID that you registered with Google Cloud.
const iosClientId = 'my-ios.apps.googleusercontent.com';
final GoogleSignIn googleSignIn = GoogleSignIn(
clientId: iosClientId,
serverClientId: webClientId,
);
なので、ここ以外で、androidClientId
を使うタイミングがなければそもそも定義削除して問題なさそう。