sgrksmt)です。-コメルコ-(以下、Komerco)の開発を担当しています。入社前はお世話になっていたこの技術ブログに自分が投稿する日がくるとは...。Komercoは、「料理が楽しくなるマルシェアプリ」というコンセプトの元、料理が楽しくなる器やカトラリー、リネン雑貨等を出品/購入できるサービスで、現在はiOS版のアプリケーションを提供しています。Kitchen#16などでもお伝えしてきていますが、現在KomercoではバックエンドでFirebaseを活用しています。Firestoreのセキュリティルールのテストの方法についてご紹介します。API経由でデータを安全に読み書きできるよう、セキュリティルールを記述することができます。Authenticationでの認証を活用しつつ、どのような条件下でドキュメントを読み取ることができるか、書き込むことができるかを設定し、ユーザーのデータを保護します。Storageにもセキュリティルールがあります。セキュリティルールをしっかり設定しないと、本来読み取られてはいけないデータが悪意のある第三者に読み取られてしまったり、特定のフィールドを書き換えられてしまうといったことが起こります。Firestoreの次のような利点を享受しにくくなります。リアルタイムでの情報の取得オフラインから復帰したときに、ローカルでの変更を書き込むなので、実際にアプリケーション開発をしていく場合は全ルールを閉じる運用よりは、ルールを適切に設定して運用していくことが多くなるかと思います。エラーの内容も「permission-denied」程度のものしかないので何が原因か掴みづらいです。一応、rulesの構文自体が間違っているかどうかはデプロイ前に検出してくれるので、構文がおかしくなっている場合は気づけますが、typoなんてしてしまった日にはなかなか気づきづらく、デプロイと確認だけで日が暮れてしまうこともありえます。rulesの動作を書き込む前に確認できる「シミュレータ」の機能がFirebaseのコンソール上に搭載されました。Simulator!Firestoreのrulesシミュレーターは、FirestoreのProjectからDatabase→Firestore→ルールとたどり、この部分をクリックすることで利用することができます。開くと、このような画面になっており、指定したドキュメントのパスに対して、readやwriteのルールを記述されたルールを基にシミュレートして確認することができます。認証情報も指定したテストができるので、認証ありきの条件もシミュレートすることが可能です。以前私がQiitaに掲載した記事でも操作方法など書いていますのでよければ併せて御覧ください。Firestoreのルールシミュレーターを使ってみるシミュレータを用いると以下のメリットがあります。テストを構築していくことにしました。Projectを準備するテスト環境にfirestore.rulesファイルをにデプロイする。rulesが期待通りの動作をするかをテストする手元でテストを実行できる他、CI経由でも継続的にテストが行えるようにするとなります。順に、簡単なテストの例も交えつつ説明していきます。構成テストの構成としては、次のようになっています。普段のアプリケーション開発では開発環境用に必要なものをデプロイしたり、DBの読み書きを行っています。Projectを準備し、そこにrulesをデプロイしています。Projectにし、その環境のFirestoreのDBに対して読み書きを実行し、rulesのテストをします。テストは手元からCLI経由で実行する他に、GitHub上にPullRequestが作成された時や、materブランチにマージされたタイミングで、CI経由でテストを実行するようにしています。Project上で行っています。準備テストを書くにあたり、jestを利用しているので、npmもしくはyarnにて追加します。jestは、Facebook社がOSSとして提供している、JavaScriptでユニットテストを行うためのフレームワークです。RSpecのような記述が可能となります。今回はjestを使った場合でのテストの紹介となりますが、テストのフレームワークは任意のものでも構いません。ディレクトリ以下に配置していきます。ディレクトリ以下に配置しています。Firebaseの初期化をするテストで使うFirebaseの初期化をします。Functions等でFirebaseを扱うときは、adminSDKが使えるようadmin権限での初期化をすることが多いのですが、admin権限でFirebaseを初期化してしまうと、設定したrulesに関係なく管理者権限にて読み書きが可能となってしまうので、Webアプリケーションと同様の初期化を行います。任意のテストディレクトリ以下に配置し、以下のように記述します。}各種configの変数はご自身のテスト環境用のプロジェクトのIDを指定してください。(基本的には.env等から参照することになると思います。)これら初期化した変数は次のようにテストファイルでimportして使用します。WebHelper.firestore.collection('post').doc()モデルを定義するドキュメントのモデル定義をします。今回は例として、Postドキュメントの定義をします。boolean}次項では、このPostドキュメントのcreateオペレーションに関するテストの例をご紹介します。(すべてのオペレーションの例を紹介したいのですが、長くなるので割愛します。認証ユーザーのuidと一致するという条件のもと、書き込みが正常に行われるのを期待するケースと、失敗し、permission-deniedがエラーとして返却されるのを期待するケースを記述します。(失敗するケースは複数想定されますが、ここでは1つのケースに絞ります。)posts.test.tsを作成し、次のように記述します。})})(モックデータの作成に関する処理、モデル定義等は別途別のファイルに分割するほうが良いですが、今回は例を示すために同一のファイル内に置いています。ここまでで実行すると、rulesがまだ書けていない場合はテストが通らないと思います。次にこのテストを通過するための正しいrulesを記述します。}}これをテスト環境にデプロイし、再度テストを実行することで、テストが通るようになります。紹介のため割愛しているテストケースがありますので、実際にはもう少しテストケースが多く、厚いものになると思います。rules自体も、各種フィールドのvalidationを行ったりと複雑になるかと思います)事前にテストデータを作成するテストを書いていると、セキュリティルールの制約を受けずにテストデータを作成したり、CloudFunctionsで生成したり、事前にDBに格納しているのが前提で、読み出すだけのデータを準備したいケースがでてきます。その場合はadmin権限でFirebaseを初期化したものを別途用意し、rulesの息のかからないところでテストデータを作成します。SDKの初期化を行います。accountの取扱には注意です。追加するこれにより、事前にPostドキュメントを作成し、そのPostドキュメントが取得可能かどうかのテストが次のように記述できます。...writeのrule})今回追加した、postドキュメントのgetに関するルールを次のように追加することで、上記テストが通るようになります。Functionsのテストも実施しています。料金はほとんどそこまでかかっていません。先にも触れましたが、テストを実行する環境と、普段開発している環境を分けているので、開発環境のDBが汚染されたりすることもありません。Firestoreのルールのテストを書くことでのメリットテストを書くことによるメリットとしてはアプリケーションを手動で動かしたり、シミュレータに頼ることなく(継続的に)rulesが正しく動作するか確かめることができるrulesの変更が容易になる(書き換えた結果、正しくない場合にテストがあることで検知することができる。普段のアプリケーション開発と同様で、テストがあることで、後の変更にも強くなり、rulesを変更することに臆することもなく、また高速に動作検証が行えるようになります。事前にセキュリティを意識したドキュメントの設計がしやすくなり、見通しも良くなるので最近の開発では新機能の追加や改善に伴ってドキュメントの設計をするときは、同時にrulesのテストも記述し開発をしています。さいごにFirestoreのrulesに関して、より継続的に確認が行えるためのテストについてご紹介しました。今回ご紹介したサンプルコードをGitHubにて公開していますので、よければ併せて御覧ください。rulesの継続的なテストを行えるようにしています。した事例に関わらず、Komerco開発チームではFirebaseと向き合って、その上でサービス提供ができるよう努めていきます。クックパッドでは、Firebaseなど最新技術に興味がある!技術的に挑戦してサービスをより良くしたい!というエンジニアを募集しています。MessagingのUIをカスタマイズして運用するKomerco事業部エンジニアの岸本(@_sgr_ksmt)です。F...2019-07-05Firebaseで運用するKomercoの管理用アプリケーションの開発こんにちは。Komerco事業部エンジニアの高橋(id:yosuke403)です...2018-11-15デザインとエンジニアリングをつなげる取り組みこんにちは、Komerco事業部デザイナーの藤井(@kenshir0f)です。Firestoreのrulesのテストを全てローカルエミュレータを使うように書き換えた...Komerco事業部エンジニアの岸本(id:sgrksmt)です。コメルコテックバナシ〜新規事業開発のリ...こんにちは。使ったセキュリティログ検索基盤の構築サービス特性にあった検索システムの設計戦略クックパッド採用説明会「クックパッドはサービスの作り手を採用したいんです。/*}*/スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。