RTMFP ストリームに対するアクセス制御についての話題です。今回も Flash Player 10 の開発環境があれば大丈夫です。
ストリームへのアクセス制御
Strutas には個々のノードを認証する仕組みがありません。そのため、ノード ID (と開発者キー) が分かってしまえば誰でもパブリッシュ中のストリームを受信できてしまいそうです。。。
このような場合、送信しているノード内に、他のノードからのアクセスを制御する機能を持ちたくなるかもしれません。ということで、NetStream には P2P ストリームへの接続要求に対するロジックを記述する手段が提供されています。
これによって、Strutas のように認証の仕組みが無いランデブーサービスを利用していても、別の認証サービスを併用して接続可否を判断することが可能になります。例えば、事前に認証サービスに登録されている farID 以外からのリクエストは受け付けないように、とかいう使い方ができます。
onPeerConnect() メソッド
ストリームに対するアクセス制御を実現する手段として NetStream に追加されたメソッドが onPeerConnect() です。
onPeerConnect() は、他のノードからの接続要求があると、実際の接続が行なわれる前に呼び出されます。そのため、アクセス許可の判断がまだ間に合うというわけです。もちろん、他の目的に使うこともできるかもですが。
onPeerConnect() の定義は下のとおりです。戻り値は Boolean で、true を返すと接続許可 false だと接続拒否の指示になります。
public function onPeerConnect(subscriber:NetStream):Boolean
引数には、接続要求をしているノードの NetStream オブジェクトが渡されます。NetStream には、相手 RTMFP ノードの ID を保持する属性 farID が追加されているので、認証に使えそうです。
NetStream.farID:String [参照のみ]
ちなみに NetStream には nearID 属性はありません。
下は onPeerConnect() メソッドをごくごく単純してみたサンプルです。
private function onPeerConnect(subscriber:NetStream):Boolean { // ここにアクセスコントロールのためのロジックを記述 var accept = checkPeer(subscriber.farID); if (accept) // 許可する場合 return true; else // 許可しない場合 return false; }
NetStream.client
onPeerConnect() を使うには、onPeerConnect() メソッドの定義されたオブジェクトを作り、それを送信側 NetStream インスタンスの client 属性に設定します。
// オブジェクトを生成 var checkClient:Object = new Object(); // オブジェクトに onPeerConnect() メソッドを定義 checkClient.onPeerConnect = function(subscriber:NetStream):Boolean { // ...省略 }; // 送信ストリームの client 属性にオブジェクトを設定 _sendStream.client = checkClient;
client に設定するオブジェクトには、カスタムクラスを定義することもできます。
その場合は、
class ACLClient { public function onPeerConnect(subscriber:NetStream):Boolean { // ...省略 } }
のようなクラス宣言をしておいて、
// 送信ストリームの client 属性にオブジェクトを設定 _sendStream.client = new ACLClient();
のようにします。
1 対 1 型のストリーミング接続でアクセス制御をする手段は onPeerConnect() 以外にありません。なので、ストリーム送信者が onPeerConnect() を実装していない場合、全ての要求が受け付けられます。
NetStatusEvent
ノード間の NetStream の接続状況は NetStatusEvent を使って通知されます。以下の 4 種類があります。
NetStream.Connect.Success // 接続が成功した NetStream.Connect.Failed // 接続に失敗した NetStream.Connect.Closed // 接続が閉じられた NetStream.Connect.Rejected // 接続が拒否された
これらのイベントでは event.info.stream から接続処理の対象となっている NetStream オブジェクトを参照することができます。
コメントする