【2018年4月20日追記】この記事は内容が古くなっている部分があります。「あらためてチャットサポートを構築する」もご覧ください。【追記ここまで】
前回の「チャットサポートを構築する (その1)」は、Converse.js を設置し、(テストのページ)のように、普通の XMPP クライアントとして使えるというところまででした。
BOSH サーバー
ここからしばらく、サーバー側の設定の話になります。
クライアントが Converse.js などウェブベースのもので内部状態を保持できないような場合、BOSHという仕組みを介することで、接続を維持します。XMPP サーバーの ejabberd の場合、設定ファイル ejabberd.cfg に次のように書くことで、BOSH サーバーにもなります[1]。
ポート 5281 (HTTPSの場合)を listen するところに http-bind と書き足します。
{listen,
[
...
{5281, ejabberd_http, [
...
http_bind,
...
]}
...
]}
モジュールの設定のところで
{modules,
[
...
{mod_http_bind, []},
...
]}
を読み込むようにします。
匿名サーバー
XMPP サーバーには匿名サーバーという機能を持つものがあります。一般にクライアントがサーバーに接続する場合、事前に登録して作成しておいた user@example.net という形をした JID と、パスワードが必要になりますが、匿名サーバーは、そのサーバー名だけを指定して接続を試みると、@ より前のユーザー名を乱数のようにそのつど生成して接続します。
サーバーアプリケーション ejabberd の場合、ejabberd.cfg につぎのように設定して SASL 匿名サーバー (anonymous.example.net という名前だとします) を設置します。
{hosts, [ ..., "anonymous.example.net"]}.
{host_config, "anonymous.example.net", [
...
{auth_method, anonymous},
{anonymous_protocol, sasl_anon},
{s2s_default_policy, deny},
{{s2s_host,"example.net"}, allow},
...
]}.
s2s_... は、匿名サーバーに接続したユーザーは特定のサーバー以外への通信を禁止するという設定です。
クライアント側の事前接続
ここからクライアント側の話です。
「チャットサポート」として利用できるためには
- アプリケーションの事前インストールが不要
- アカウント(JID)の登録が不要
- 連絡先が登録済み
であることが必要です。前回はこの最初の項目、Converse.js をごくふつうに設置する(テストのページ)ところまで行いましたが、このままでは客側にアカウント (JID) を入力してもらわなければなりません。
Converse.js のマニュアルに Server-side authentication という章があります。別の何らかの方法で事前にサーバーに接続しておき、その情報を引き継げば、上述の2番めの項目をクリアできます。接続先を匿名サーバにすればパスワードも不要になります。しかし、マニュアルには具体的な方法はありません。
次のような方法を考えてみましたがこれで正しいのかよくわかっていません。とりあえず(ある場合には)うまくいっています。もし詳しい方がありましたら、ぜひ教えてください。
Converse.js の初期設定を書く <script> のところの先頭に書き足します。
<script TYPE="text/javascript">
var BOSH_SERVICE = 'https://anonymous.example.net:5281/http-bind';
conn = new Strophe.Connection(BOSH_SERVICE);
conn.connect('anonymous.example.net', '', onConnect);
function onConnect(status)
{
wpCookies.set('jid', conn.jid);
wpCookies.set('sid', conn.sid);
wpCookies.set('rid', conn.rid);
}
Strophe.js は Converse.js に同梱されているので、Converse.js を利用できるようにしていれば、使えます。接続すると JID、SID、RID が確定するので、それをクッキーとして書き出します。ここでは WordPress の wp-include/js/utils.js を利用した記述 wpCookies.set になっていますが、もちろんそれでなくてもかまいません。
それに続く Converse.js の設定では
require(['converse'], function (converse) {
converse.initialize({
...
bosh_service_url: BOSH_SERVICE,
prebind: true,
jid: wpCookies.get('jid'),
rid: wpCookies.get('rid'),
sid: wpCookies.get('sid'),
...
});
});
</script>
と、bosh_service_url を指定し、prebind を true とし、jid, rid, sid をクッキーから読み込みます。
- BOSH サーバーには2種類あります。local BOSH サーバーは、入り口はどこからでも接続できますが、ローカルのアカウントにしか接続できません。それに対して open BOSH サーバーは、他所のサーバーのアカウントにも接続できます。ejabberd の BOSH は local タイプです。↑