これまで、GoInstantのデータの取り扱いについて説明してきましたが、実際のアプリケーションでは

”このルームにはこのユーザしか入れない”とか

”この時間になったら、このルームへの入出を許そう”とか

”このデータを取得できるのはadminユーザだけ”とか

そういったアクセスコントロール要件が出てきます。

 

もちろんこういったアクセスコントロールにもGoInstantは対応しています。

ということで、今回はACLについて。

 

基本的にGoInstantではAccess ControlというJSONの設定とユーザのJWT(ユーザ名とかグループ名)によって

制御することができます。

 

例えば、RoomにJoinできるユーザを絞り込みたいときは

こんな感じにやると、localhostで発行されたtzm@freedom-man.comっていうユーザがJoinできる設定になります。

(@を%40にしないとエラーになったので、ちゃんとURLエンコードしないとダメみたい…。)

 

グループだとこんな感じ。

freedom-manっていうグループに属するユーザはJoinできるっていう設定になります。

 

一つ一つ特定のユーザ名やグループ名を設定するのは正直しんどいので、

ルームの名前が付いたグループとかユーザ名を一括で許可する設定ができます。

こうすると、ルームの名前 + “-grp”の名前(lobbyだったら”lobby-grp”)のグループに対して

一括でJoinの権限を付与することができます。

 

あるキーの読み取りを制限したい場合は以下のように書きます。

これで、localhostから発行されたtzm@freedom-man.comユーザのみtestキーの値を取得することが出来ます。

 

onメソッドのイベントも制御することができます。

こうすると、on(“set”, … と記述してもlocalhost:tzm@freedom-man.comユーザ以外では

コールバック関数が実行されることはありません。

 

これらのACLを設定して、あとはグループとユーザ名の制御をJWTで行ってあげればOKです。

python + flaskだとこんな感じ。※スクリプトタグでのJS呼び出しで対応しているのでFlaskのResponseがJSです。

 

JWTの生成にはGoInstantと共有している秘密鍵が必要で、ユーザが自分自身で生成することは不可能です。

つまりJWT生成を行うサーバサイドで、「この時間帯でこのユーザであればRoomへのJoinは禁止しよう」等の

細かい制御をすることになります。

※expire的なパラメータが無いので、使い回しはできちゃいそうですが…。

 

パーミッションでエラーになったときはこんな感じのエラーが出ます。

goinstant-permissionerror