概要
違反ユーザーのアカウント停止を行おうとした時にちょっと困ったので書いておきます。内容は、Firebase の Authentication を使って匿名ログインをしているユーザーのアカウントを無効にする方法です。
てっきりコンソールの Authentication から「アカウントを無効にする」で簡単にできるのだろうなと思っていたのですが、匿名ユーザーに対しては出来ませんでした。(メールアドレス認証の場合、認証時にエラーが返っていたと思います)これは、Auth クラスの signInAnonymously((completion:)) メソッドが新たに新規匿名ユーザーを作成してサインインしてしまうからです。つまり、コンソールから「アカウントを無効にする」を行っても、対象のユーザーは新しい匿名ユーザーとしてアプリを引き続き利用することができてしまいます。
対応方法
対応方法は簡単です。DB に無効アカウント用のコレクション(bannedUser)を用意して、そこに対象ユーザーのIDのドキュメントを作成しておきます。次に、DBルールでリクエストしたユーザーがコレクションに含まれているかどうかの条件を追加します。下記のようになります。
service cloud.firestore {
match /databases/{database}/documents {
function isAuthenticated() {
return request.auth != null;
}
function isBannedUser(userID) {
return exists(/databases/$(database)/documents/bannedUser/$(userID));
}
match /comment/{commentID} {
allow read: if isAuthenticated();
allow write: if isAuthenticated() &&
!isBannedUser(request.resource.data.userID);
}
...
}
上記の例では、対象ユーザーからのコメントの書き込みを防ぐことができます。rules.firestore
の exists メソッドを利用するところがポイントです。
まとめ
この方法以外にも例えば User
オブジェクトに isActive
のようなプロパティを持たせてアプリ側で制御する方法が考えられますが、その場合、考慮しなくてはいけないことが増え、アプリの実装が複雑になってしまうのが難点です。
最近 Rules Simulator のアナウンスがありましたが、これを使えばわざわざデプロイしなくても動作確認ができます。コンソールの機能が充実していくとより使いやすくなって良いですね。