Firebaseのセキュリティ設定はこのようにすることで誰でも書き込み可能になります。
{
"rules": {
".read": true,
".write": true
}
}
これはデータベース中の全てのデータが認証なしに無条件に読み書き削除が可能という最もゆるい状態です。アプリケーションのプロトタイプを作っていく間はこの方が余計なトラブルがなくて良いかもしれませんが、一般公開するシステムでこのような設定になっていると外部からいたずらでデータを改ざんされたり削除されたりする可能性があるので、きちんとセキュリティ設定をしなければいけません。
秘密鍵で認証する
一番簡単なセキュリティ設定は、全ての読み書きを秘密鍵で認証されたクライアントのみで行うようにすることです。
まず、セキュリティ設定を全て読み書き不可にします。
{
"rules": {
".read": false,
".write": false
}
}
こうすることで、RESTやFirebase SDKを使用したデータベースの読み書きは一切できなくなります。が、管理コンソールからデータをいじる場合と秘密鍵を使って認証した場合は上記のセキュリティ設定に関わらず全てのデータを読み書きできます。
一番堅牢かつシンプルなセキュリティ設定ですが、秘密鍵が絶対に漏れないように注意しましょう。
特定の変更操作のみを許可する
".validate"
の記述を使うことで、どのようなデータ変更を許可するかを細く設定することが可能です。例えば以下のようなデータ構造の時にcontent.id123.usedCount
にはカウントアップの変更のみを許可したいとします。
{
"content": {
"id123": {
"usedCount": 0,
"firstUser": "Taro"
}
}
}
これはセキュリティ設定をこうすれば実現できます。
{
"rules": {
".read": false,
".write": false,
"content": {
"$id": {
"usedCount": {
".write": true, // 誰でも変更可能
".validate": "newData.val() == data.val() + 1" // 前のデータより1大きい値のみ設定可能
}
}
}
}
}
その他、例えばcontent.id123.firstUser
にデータがなかった時に新規作成はできるが、更新は不可とするというルールにしたければ次のようになります。
{
"rules": {
".read": false,
".write": false,
"content": {
"$id": {
"firstUser": {
".write": true, // 誰でも変更可能
".validate": "!data.exists()" // 以前のデータが存在しない場合のみ許可
}
}
}
}
}
このようにきちっと書き込みルールを設定しておけば、普通ならサーバー側に隠蔽して行うデータベースアクセス処理でも直接クライアントから行わせられるようになります。
Firebase便利ですね。