前回の記事では Node.js と FirebaseCLI をインストールして、ターミナルから Firebase にログインできるようになるまでを記載したので、今回は Firebae についての知識と課金ユーザーを管理する方法をやっていきます。
開発環境(前提条件)
前記事からの引用みたいなもんですが、一応記載します。
・macOS BigSur
・Homebrew
・Xcode12.3
・Swift5
・Node.js
※課金実装や Firebase 連携は済んでいるものとします。
Firebase で利用するサービスについて
Firebase では、ユーザーの認証・管理を行う Authentication、高機能なデータベースを扱うことができる RealtimeDatabase や CloudFirestore、写真や動画を保管・提供する CloudStorage など、様々なバックエンド機能が提供されています。
バックエンドを一から勉強するとなると、構築はもちろん、運用・保守やパフォーマンス、セキュリティも考慮して…って感じでやること多すぎて簡単にゲロ吐けます。
ざるっざるなセキュリティでユーザー情報抜かれましたァ!って事態は「未経験だったので…」って言い訳も通用しないですし。
そんな事態を避けるべく、以下のサービス3つを使います!
Firebase Authentication → ユーザー ID などの情報の管理・識別など
Cloud Functions → レシート検証や購入・復元の処理など
Cloud Firestore → 課金履歴やアイテム管理など
気をつけないといけないポイントや従来とは違う実装方法が多々あるので、すぐ使えるかというとそうでもないので、次はそれらを説明します。
Firebase 的実装ポイント
セキュリティルール
Firebase の勉強を始める前に疑問だったのが、データベースどうやって触るの?ってことでした。
結論から言うと
直接触るッ!(こともできる)
CloudFunctions 経由でやれば、アプリ側は関与しないこともできますが、直接操作することも可能なんです。
個人的には結構衝撃的でした。
もし悪意丸出しユーザーがデータを改竄したら、そのまま保存されるんですよ。
課金したアイテム情報を書き換えちゃうなんてことも可能です。
他にも、ユーザー情報として「年齢」があり、データベース上では「数値」で管理してるとします。
それを「文字列」で API をたたいた場合、間にサーバーサイドが入るので対処できますが、Firebase の場合はそのまま保存されちゃいます。悪意丸出しじゃなくても。
そういうことが起きないようにするのが「セキュリティルール」です。
後述しますが、データの機密性と整合性を担保するためのロジックを書きます。
オフライン対応
Firebase が提供する各サービスは、不安定なネットワーク(以下、オフライン)でもスムーズに稼働できるよう設計されています。
これは鬼便利ですが、取扱注意です。
API をたたく場合はエラーハンドリングすればよかったのですが、オフラインでも稼働できる Firebase では、ネイティブ側の設計方法も全く違ってきます。
オフラインでもリクエストがエラーにならず、オンラインに戻ったら自動でリクエストするので、現状、書き込み処理がエラーになるということを想定した作りになっていません。
そのため、今までのように API をたたくような設計をすると「通信環境が悪くて、処理は終わってない」けど、アプリ上では「エラーは発生せず、処理は完了している」という風になってしまいます…
オフライン機能をオフにすることも可能ですが、Firebase の良さを活かさないのはもったいないので、出来るだけオフラインに沿った実装をしていくことがベストだと思います。
Firebase Authentication でユーザーを識別・管理する
Firebase Authentication について
先ほどもちらっと説明しましたが、メールアドレス&パスワード、電話番号、Twitter や Facebook などの SNS 認証を行うことができ、それによってユーザーを管理する機能を提供しています。
それをざっくり説明するかわいい公式動画(日本語字幕付)もあります。
FirebaseUI という各種ログインの UI を担ったものも提供されています。
私は試していませんが、カスタマイズも可能とのこと。
ユーザーを識別できるようにする
まずはユーザーを識別できるようにしますが、ログイン機能は使いません。(使っても大丈夫です)
ログイン不要でユニークの識別子をこちらで割り振れる匿名認証を使います。
あとからログイン登録することもできるので、それまでのユーザー情報の引き継ぎも簡単に行えます。
Xcode を起動して、匿名認証したいクラスに以下を貼り付けましょう。import Firebase も忘れずに。
1 2 3 4 5 6 7 8 9 10 11 |
Auth.auth().signInAnonymously { authDataResult, error in // authDataResult?.user.uid } //----- スッピン加工するならこんなノリ -----// func signInAnonymously(completion: @escaping ((_ uid: String?, _ error: Error?) -> ())) { Auth.auth().signInAnonymously { authDataResult, error in completion(authDataResult?.user.uid, error) } } |
これ以上ないだろってレベルでシンプル。
匿名認証は完了しているので、アプリを削除して再インストールしても、同じ UID が返ってきます。
Firebase をブラウザで開いて Authentication → Users を見ると、匿名ユーザーも登録されてます。
この時点で今回の目標だったユーザーの識別・管理ができました(*’∀’人)
さいごに
ここまでを自前で構築するとなると相当な勉強が必要になると思いますが、Firebase のおかげでネイティブ側に注力できますねー
次は CloudFunctions を使用したレシート検証的なものを書こうと思います。
コメント