編集:この質問を単純化しようとする...非常に基本的なレベルで、これはセッションシステムのかなり基本的な必要性でなければならないと私は信じています...onDisconnect機能を壊さずにSECUREセッショントラッカーをどのように持つのですか? セキュリティ ルールを追加すると、onDisconnect は機能しません。セキュリティ ルールを追加しないと、保護されていないテーブルに書き込みを行ったり、他のユーザーの存在を削除したりして、だれでもログイン セッションを「偽装」できます。
「onDisconnect」が呼び出されない問題を解決しようとしています。私のセキュリティ ルールでは、ログインしているユーザーのみが /sessions/$userid/"true" にプレゼンス データを書き込むことが許可されているためです。ユーザーはログインしていますが、そのユーザーがログアウトした後、またはタイムアウトのためにログアウトした後にブラウザーを閉じると、onDisconnect はセキュリティ ルールによってブロックされます。
最初は...「ああ、ログアウトが発生した場所にさかのぼって、そこにセッションの存在をもう一度クリーンアップすることができる」と思いました。しかし、さらに考えてみると、auth = newFirebaseSimpleLogin コールバックの "else" ブロックがログアウトを検出する唯一の方法であるように思われることに気付くでしょう。それに加えて、ログアウトが発生した後にコールバックが返されるため、onDisconnect 呼び出しでセッションを削除できるようにログインする必要がある場所に戻りますが、この時点では既にログアウトしています。
何か不足していますか?私が認識していないログアウト前の呼び出しはありますか? onDisconnect がログアウト後にセッションを削除できるようにするために、セキュリティ ルール ファイルでできる特別なことはありますか?
問題の「テーブル」に対して私が持っているセキュリティルールブロックは次のとおりです。
"sessions":{
"$user":{
".write": "$user == auth.uid"
}
},
JS では単純です。
var con = ref.sessions[user].push(true);
con.onDisconnect().remove();
予想どおり、onDisconnect にログインしていないため、次のようになります。
FIREBASE WARNING: set at /sessions/simplelogin:16 failed: permission_denied
編集:反対票とは何ですか? =/