少し前から、GooglePlayStoreでアプリ内課金を使ったアプリを個人的にリリースすべく作業をしていまして、初めて扱うKotlinやGoogle Purchasesなどでいくつか記事を投稿させてもらいました。
https://qiita.com/taedookim/items/a4280ed9d66288c24b51
https://qiita.com/taedookim/items/698982a89f97e3576544
https://qiita.com/taedookim/items/66cdfcad526b33fd03e2
そんなわけで四苦八苦していたアプリが、一応基本的な動作については問題なく動くところまで来ましたので、リリース手続きをしまして、いざ公開!となったところで躓いたお話です。
先に結論から言いますと、FirebaseAuthというよりはそこで利用しているGoogle Sign-InやFacebook Loginの要件が満たせていなかった、ということだったのですが、開発作業を進めている中ではいろいろと気づかないまま進んでしまった結果見落としていたポイントでしたので、自戒も込めて書かせていただきます。
やっていたこと
上記の通り、アプリではGoogle Play Storeのアプリ内課金を利用する想定でいたため、ユーザー管理のため、Firebaseを使おうと考えて実装を進めていました。
何分個人アプリなのであまりユーザー管理などに運用の労力は裂きたくないなというのが正直なところでして、OAuthを使い、GoogleアカウントやFacebookアカウントを使ってログインしてもらい、ユーザー識別だけできればいいや、と考えていたのが発端です。
実装の対応としては、FirebaseAuthの公式ドキュメントを参考にしていました。
UIまで用意されているし、簡単に実装できるものなんだなぁ~と思いながら、公式ドキュメントの指示に従い、FirebaseConsoleの設定を行って比較的開発初期の段階で無事、ログインできるようになり、課金などのアプリ部分の実装へ。
すべてが整って、いざリリース手続きということで、クローズドテストを設定したところ、Play Storeからダウンロードしたアプリでは、サインインに失敗する、という事象が起きました。
確認したこと
開発環境から直接端末にインストールして実行するとやはり正常にサインイン可能。
ということで、何が違うんだ??と、PlayStoreからインストールしたバイナリを実行している端末をPCにつないでLogを確認したところ、サインインを実行したところで以下のようなエラーが出ていました。(エラーメッセージ自体は消してしまったのですが、検索時に見つけたサイトに記載されていた内容からの抜粋でこんな感じのメッセージだったはずです)
com.google.android.gms.common.api.ApiException: 10:
GoogleからAPIエラーが出ているというのはわかりましたが、10というエラーコードの意味がわからず検索してみたところ
https://stackoverflow.com/questions/47437678/why-do-i-get-com-google-android-gms-common-api-apiexception-10
このページに行き着きました。
ページ内に記載のアドバイスに従い、今度はFirebaseUIではなく、GCPのコンソール上で各種環境設定を行い、Google Sign-Inを使ってみるが、やはり同様に開発環境ではOKなのにPlay Store経由になるとNG。
続いて、Firebaseと連動させていたFacebookを使って実装してみましたがそれでも事象は解消されず。
ここまで来てふと、GCPのコンソールをよく見て気づいたのが、ドメインの承認に関する項目。
OAuth同意画面の項目にあるこれらの項目ですが、一番下の「アプリケーション利用規約リンク」の欄には (省略可) とあるのに、その上2か所、アプリケーションホームページリンクとアプリケーションプライバシーポリシーリンクの欄には、その文言がありませんでした。
ここにきてようやく「あ!もしかしてこれ、専用ドメインのWebサイトが必要なんじゃ?!」という初歩的なことに気づいたのでした…
対処方法
今回のアプリでは、FirebaseとGoogle Play課金機能の実装を試したいというのが主目的で、個人でやっているということもあり、特にサービスサイトなどは作成は予定していませんでした。
よくよく考えてみたら、こんな怪しいサービス提供者に各SNSのアカウントを利用させるって、結構リスクが高いことだよなぁ~ということで、どう考えてもセキュリティ的にNGか。ときっぱり諦めまして、Firebaseで提供されている、Email認証を採用することにしました。
そもそもEmail認証を採用しなかった理由としては、先ほど書いた、アカウントはあくまで識別できればよくてこちらで管理をするためのコストをかけたくないな、という点と、アカウント認証できたほうがユーザーにとって便利だろう、という2点でした。
ただ、いざEmail認証を実装してみると、そもそもEmailの初期値として実行中のAndroid端末に登録されているGoogleアカウントのメールアドレスが入力候補として表示され自動入力できますし、パスワードだけ登録する必要はありましたがそのパスワードもSmart Linkで自動的に記録されて、ユーザーの手間暇はほとんどなアカウント認証と変わらないな~というのが実感でした。
ということで、各種APIを使うならともかく、アプリ内で最低限のユーザー識別さえできればいい、ということであれば、Email認証で十分だし、最初からこれを採用していればよかったな…というお話でした。
同じような境遇になる人はあまりいない気もします(大体は業務で開発した場合は、きちんとサービスサイトは用意されると思いますし…)が、もし、これからアプリ開発をするのに、どういう認証方法を選ぼうか、ということを考えている人がいましたら、併せて「何をやらなきゃいけないか」を認識するのに一助となれば幸いです。