🥶

【疑問】AndroidでGoogle SignInができない原因と解決方法【Flutter/Firebase】

3 min read

はじめに

開発環境では問題ないのに、本番環境でのみAndroidのGoogle SignInができない。

FlutterとFirebaseを使った個人開発時に遭遇したエラーです。
この原因が

  • なかなか気づけないものだと感じた
  • 原因の認識が正しいか自信がなく情報があれば教えていただきたい

と考えたのでシェアしたいと思います。

このエラーには半年ほど悩まされてました。。。

このissue開いたのが6ヶ月前。。。

背景の説明

  • 開発環境(エラーが解消した21年5月時点)
Flutter 2.2.0 (stable)
Dart sdk: ">=2.12.0 < 3.0.0"
google_sign_in: ^5.0.4
  • エラー概要
    本番環境でAndroidのGoogle SignInができない。

  • エラー内容詳細
    AndroidでGoogle SignInとFirebase Authを利用したログインが以下のエラーで機能しない現象に遭遇。

(PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 12500: , null))

また、
開発環境では問題なく、本番環境にのみエラーが発生。
iOSでは問題なく機能。
他のログイン機能(メール認証、SignIn with Apple)も問題なし。

原因と解決方法

原因

AndroidのAPIキーにAndoridアプリのみアクセスできるように認証制限をかけていたことが原因と推測されます。

解決方法

認証制限をなしにすることで問題なく機能。

修正手順(画像つき)

1. Google Cloud Platformから、APIとサービス→認証情報へ

2. 該当のAPIキーをクリック

3. アプリケーションの制限をなしに変更

説明

今回のエラーは

・Google SignInがWebフローに基づいている。
・しかし、認証APIをAndroidのみにしていた。
・そのため、認証が弾かれてエラーが発生した。

と自分は理解しました。

というのも、エラーの解決方法を調べていたところ、
「AndoridでSign in with Appleでログインできない」
というissueを発見。

https://github.com/firebase/firebase-android-sdk/issues/1757

見てみると公式からこんな解答が載っていました。

Hey there, Malcolm from Firebase here!

This is a known behavior, and is due to the fact that Apple Sign-In is based on a Web flow - it kicks you to a browser to do the sign-in and then takes you back. As a result, your API key is used in a web context, so restricting >your API key to only work on Android breaks this feature.

As is presently stands, API key restrictions provide minimal benefit for Android - all it does is make it so that certain headers must show up on the request in order to be accepted. We're working on better ways to solve this issue right now, but I would suggest foregoing API key restrictions for now (since it does very little) if you need to use Apple Sign-In.

Thanks,
~Malcolm

要するに、

Apple Sign-InがWebフローに基づいている。
その結果、APIキーはウェブのコンテキストで使用されるため、APIキーをAndroid上でのみ動作するように制限すると、この機能が使えなくなりますよ〜。

知らんかった。。。
ここからヒントを得てGCPを確認するとAndroidのAPIキーをAndoridアプリのみにしていました。
(良かれと思って本番環境だけ制限してました。。。)

こちらの制限をなくしたところ、無事機能。

何をやってもダメだったですし、開発環境は制限をかけていなかったので機能したと推測、上で書いたような結論を出しました。

ちなみに、Androidのみ認証を制限しても、

現状では、APIキーを制限してもAndroidにとってのメリットは少なく、リクエストを受け付けるために特定のヘッダーを表示させるだけ。

らしいです。

自分の結論について何か情報や知見があれば、ぜひご共有いただけると嬉しいです🙏

参考:試した方法

この方法にたどり着くまでに試した・チェックした方法を載せておきます。
参考&勉強になりました、記事提供者のみなさんありがとうございました🙏

https://stackoverflow.com/questions/56188338/platformexception-platformexceptionsign-in-failed-com-google-android-gms-comm
https://qiita.com/hiraski/items/c5fb20da4a8862ec72ea
https://stackoverflow.com
https://developer.android.com

個人開発アプリ

自分はエンジニアではないですが個人開発を趣味としていて、BIG3記録管理アプリ「LifterLog」 をリリース中です。

FlutterとFirebase, Cloud Functionsで開発しています。
パワーリフティングに興味ないと全くわけわからんアプリですが、よければ一度触ってみてください!

Discussion

ログインするとコメントできます