#FJUG #firebase Firebase Summit 2018 報告会 @Google に参加してきたまとめ
年に1回Firebaseのユーザが集まって、使い方や要望を中の人達に聞くFirebase summitで発表された内容を共有する、Firebase Summit 2018 報告会が、皆さんお世話になりっぱなしのGoogleで開催されたので参加してきました。
(ついでにGoogle訪問も初めて)
これはそんな発表された内容のまとめになります。
FirestoreとSecurityまわり
Local Emulator
- FirestoreとRealtime DBのエミュレーターが登場
- 今まではtestするときはfirebaseのプロジェクトを作る必要があったが、これによりオフラインでのテストが可能になった。
- CI環境で使えたり、複数のプロジェクトでコンフリクトしないで開発できるようになった
- メリット
- テスト用のプロジェクトを用意しなくてもよくなった
- 同時にテストを走らせることができる
- セキュリティルールの問題を詳細に見ることができる
Five tips to secure your app
- firebaseを使ったアプリをどうやってセキュリティを上げるか
- Firebaseを使わない場合、OSのアップデートや監視、ユーザの対応など、アプリケーション以外にもみないといけないが、firebaseを使うことでアプリケーションに集中することができる
- Don’t trust your client
- クライアントからのリクエストは信用せず検証しましょう
- Webでは簡単にapiKeyを取得してDBにアクセスする情報を取得できる
- Okay, you can trust auth
- 認証情報を信用してほしい
- 認証すると、連携したサービスのemailのアドレスなどを取得できるが、アクセストークンを信頼してください
- アクセストークンはJWTが使われる
- Use Security Rules
- セキュリティールールを使う
- RealtimeDB 、firestoreとストレージに存在する
- アクセスコントロールを提供できる
- Authorize your users
- Attribute-Based Access Controlのアクセスコントロール
- プロジェクトを公開するか非公開するかの検証
- Roll-Based Access Control
- 管理者やモデレータなどのユーザ属性をみて検証
- セキュリティールールは関数を使ってまとめることもできる
- Attribute-Based Access Controlのアクセスコントロール
- Validate your scheme
- データのスキーマの検証を行う
- データの型、データサイズなどをチェックしましょう
- Protocol bufferというRPC用のシリアライズのものがあり、これをつかてセキュリティールールのスキーマを生成できる
- Implement business logic checks
- ビジネスロジックの実装をチェックする
- 誰が編集できるかの検証など
- But watch out for gotchas!
- クエリに対して検証を行う
- 複数の属性を持つコレクションも存在する
- それを一度に撮ろうとしてもセキュリティルールではじかれる。
- クエリを書いてpublicな属性をとるようにする
- Custom Auth Claims are useful
- カスタム認証のクレームは便利
- isAdminといった変数の属性を認証に付与できる
- アクセストークンをみてセキュリティルールをかけるので、DBに保存している情報でadminでみるとかではなく、トークンをみてadminであるかとかを見れる
- しかし、1000bytesのサイズ制限あったり、tokenが更新されるのに時間がかかる
- Test Your Rules
- セキュリティルールをテストしよう
- テストをする方法はコンソール上のシミュレータでやるか、ローカルシミュレータを使う
- Consider Cloud Functions
- 複雑すぎるゲームのロジックをセキュリティルールに書くのは大変なので、Firestoreに操作をQueueとして保存して、CloudFunctionsでチェックして反映するようにしましょう
- Admin sdkからの書き込みはセキュリティルールをバイパスできます
- Listen to the warnings
- セキュリティルールが脆弱なテスト用にだれでも書き込める状態にしているのはあるとおもうが、リリースしたら大変なことになる
- コンソールのアラートで通知されたり、大量のトラフィックがくるとメールもきたりする
- Keep your employees on a short leash
- うっかりfirestoreのデータを削除しないようにアクセス権限を適切に設定する
まとめ
- アクセスコントロールをしっかりする
- 権限、スキーマチェック、ビジネスロジックで検証
- セキュリティルールはツールを使う
- 表現が難しいのはサーバーサイドでやる
- 適切なアクセス権でかんりする
- うっかり事故を起こしたらfirebase管理者に連絡してみよう
GDPR(EU一般データ保護規則)について
- 5/25にGDPRが始まった
- 必要なデータだけ保存する
- データを貯めるだけでなく、データの削除も設計する
- friendly-pix.comがGDPRに対応して作ったものらしい
- 削除はCloudFunctionを使って確実に削除を実行するのが良さそう
firebase-tools & Google Cloud Identity / Firebase Summit 2018
- Firebase Hostingへのデプロイで、CIでやろうとするとき、今まではdeployのベストプラクティスはpushしたらcircle CIを通してdeployするのがいいと思われるが、そのときに使われるtokenはローカル環境でコマンドを打って作っていた
- しかし、トークンを作るときはログインしている個人のgoogleアカウントに紐付いてしまう
- 作成したtokenがやめると使えなくなってしまう
- 今まで作成したトークンの一覧が表示できないので安全性に難あり
- IAMの構造はIdentitiy とManagementに分かれている
- サーバ側で使う場合はServiceAccountで使うべき
- Compute engineなどはデフォルトサービスアカウントが設定されている
- Firebase-tools v6.1.0
- GOOGLE_APPLICATION_CREDENTIALSが追加された
- GOOGLE_APPLICATION_CREDENTIALSの環境変数に渡したjsonをつかってくれるようになった
- API有効化の設定をしたあとにやると、ログインしなくてもデプロイなどができるようになった
- firebaseのGUIでもサービスアカウントからデプロイできているのが検証できる
Analytics / Marketing
- summitにいって思ったことはFirebaseでほぼ完結する!
- Firebase Analyticsは、User propertiesが25個まで、event500個まで作れるが、これで足りないというのは設計に難あり
- でっかいアプリでもイベント数は300個くらい
マーケティングの基礎知識
- 最初にユーザが入るがだんだんとユーザは離脱していく
- それを離脱させないようにするのがマーケティング
- 新規で登録してくれた人がいつまでいるのがリテンション
Audience
- Audienceにはユーザセグメントを定義できる
- 今回除外グループの設定ができるようになった
- アクティブユーザから課金しているユーザを対象外にして、アクティブユーザを出すなどできる
RemoteConfig
- コンソールでおしたらアプリの動作がリアルタイムに変更可能に
- ユースケースとして、ゲームの難易度を低くしたり、ECではアクティブでずっとみているユーザさんに対して安めのおすすめ商品を出したりしている
Cloud Messaging
- 定期配信が使えるようになった
- 例えば昨日登録して1日たったユーザにはこういう通知を送りたいといったことができる
- 非アクティブユーザをアクティブにするために、アプローチしたり、アクティブなユーザへ課金するようにアプローチしたりできる
Prediction
- ユーザの行動を予測する
- 例えば退会ユーザ予測など
- 一線を超えるユーザが1日前とかにわかっているなら、どうせ明日退会してしまうなら苦肉の策でもなんでもやれる
- ECでは原価で売ってユーザをとどまらせたり。
- 大胆な施策を打てる
Propagete Remote Config updates in real time
- Remote configの反映を即時反映する機能の仕組みは、remote configで変更を加えると、Remote configの変更をトリガーにfunctionをコールする
- そのfunctionの中でFCMをサイレントアプリに通知を出さずにデータを送信している
- そのデータをもとにアプリを更新している
- サンプルではテンプレートをとって差分をとれるものが作れる
FCM topic
- 通常デバイストークンが必要だが、topicの差分モデルで配信するときは、クライアント側からあるトピック名のトピックをsubscribeしておき、subscribeしておいたものをつかってpush通知を送る
- iosだとpush許可されたタイミングで、topicをsubscribeするようなサンプル
- Staleというデータをpush通知で送る
- iosの罠
- サイレントプッシュを送る際は、content-availableを1に入れて送るようにしてください
- Entitlements Fileを必ず入れる必要がある
- Backgrround modeをONにしてremoteをONにしないといけない
- compabilityでpush通知をONにする
- firebase側にAPNs Authentication Keyを登録する
- pushを受け取った際の処理
- pushされたデータを保存する
- 更新されたタイミングでフェッチができる
- CONFIG_STALEが有効なときにフェッチする
demo
- リアルタイムで設定が反映された
- 実は60分間に5回までしか変更できない。それ以降はすぐにフェッチできない
まとめ
- Remote Configをトリガーにして他のサービスを呼び出せる
- iOSはsilent pushを使うためにcontent-availableに注意
- real-timeのupdateに活用してみてください
@mogmetの所感
技術的な内容の他にもマーケティング的な話も聞けて充実した勉強会でした。
施策の例だけでもいろんなアプリでも試せそうなものだったのでfirebaseの技術を使っていろいろ施策を打ちたいなと思いました。
また、ローカルエミュレータもなかなか熱い機能なので、これをつかったunit testなどを作っていきたいですね。
しかし、ローカルエミュレータでの、アプリでも気軽に使えるような機能がほしい・・・(webでのGUIてきな)