red5でセキュアなコネクションを確立する

ストリーミング配信をしたい!だけど知り合い以外には見られたくないっ///
なんて思ったことはありませんか?そういう時はストリーミングサーバ側で指定したユーザ以外のコネクションが来た場合には弾くように設定しましょう!
ということで実際にやってみます。

ロジックとしてはフロントエンドのアプリケーション側でユーザ名とランダムハッシュ値XMLなどで出力するURLを作成しておき(もちろんログインしてないとアクセスできないようにしておく)、ユーザ名とハッシュ値をデータベースに登録しておきます。
次にflashが読み込まれるとそのXMLをパースしてストリーミングサーバにコネクションを張るときにパラメータとして渡します。
それをサーバ側でデータベース問い合わせして一致したらコネクションを張り、一致しなかったら弾くというふうにします。

actionscript側のコード

NetConnection ns = new NetConnection();
ns.connect("rtmp://hogehoge.com/hoge", username, hash);

NetConnectionのconnectメソッドは第一引数がコネクションを張るURLでその後は好きなようにパラメータを渡すことができます。

そしてRed5側のコードはApplicationAdapterを継承したクラスでappConnectメソッドをOverrideしてやります

@Override
public boolean appConnect(IConnection conn, Object[] params) {
name = params[0]; //flash側のusername
hash = params[1]; //   〃    hash
if(validation(name, hash)){
    return super.appConnect(conn)
}else{
    return false;
}

private boolean validation(String name, String hash){
    //正規ユーザかを確認するコード
}

ちなみにvalidationメソッドで

Set<IClient> clients = appScope.getClients();
for(IClient client : clients){
    String registeredName = (String)client.getAttribute("name");
    // return false if already connected same user
    if(registeredName.equals(name)) return false;
}
conn.getClient().setAttribute("name", name);

としておくと同じユーザ名でコネクションリクエストが来たときに弾くことができてより安全です。

今回DBへの接続にButterfly Persistenceを使用したのですが、外部のjarを利用したい場合使用したjarファイルをRed5のlibディレクトリに入れておかないとRed5実行時にエラーが起きます
RTMP接続でセキュア()ですね。