実際に XMPP ストリームを運ぶ接続を構成します。無関係な URLConnection にプロキシを設定しても、Smack の TCP 接続はメッセージングサービスへリダイレクトされません。

Smack 4.4 は HTTP、SOCKS4、SOCKS5 用の ProxyInfo ファクトリを提供します。得られたオブジェクトを XMPP 接続ビルダーに接続します:

import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.proxy.ProxyInfo;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;

ProxyInfo proxy = ProxyInfo.forSocks5Proxy(
    "proxy.example.net", 1080, proxyUser, proxyPassword
);

XMPPTCPConnectionConfiguration config =
    XMPPTCPConnectionConfiguration.builder()
        .setXmppDomain("chat.example.net")
        .setHost("xmpp-node.example.net")
        .setPort(5222)
        .setProxyInfo(proxy)
        .setSecurityMode(
            ConnectionConfiguration.SecurityMode.required
        )
        .build();

これは既存の Smack 4.4 環境向けの構成断片です。周囲のアプリケーションがビルダーの検査例外を処理し、プロキシの認証情報を供給します。明示的なホストとポートは、XMPP サービスの実際の TCP エンドポイントを表します。

役割の異なる 3 つの名前があります:

  • proxy.example.net は最初の接続を受け取る仲介者です。
  • xmpp-node.example.net はプロキシが到達を求められるサーバーエンドポイントです。
  • chat.example.net は XMPP サービスドメインで、アカウントの JID における @ より後のドメインなどです。

サービスは後者 2 つに同じ名前を使えますが、プロキシのホスト名がどちらかを置き換えることはありません。接続とその TLS 検証において、意図した XMPP サービスの識別情報を保ってください。

HTTP プロキシの場合は、適切なプロキシポートと認証情報を指定して ProxyInfo.forHttpProxy を使います。この経路には、XMPP 接続をトンネルし、その宛先ポートを許可するプロキシが必要です。HTTPS の Web 閲覧を扱うプロキシが、5222 の XMPP サービスへの TCP 接続を自動的に許可するわけではありません。

断片の必須セキュリティモードは、TLS を XMPP 接続の条件にします。これはプロキシ認証を行うものではなく、プロキシの認証情報は XMPP アカウントにログインしません。経路と安全なセッションを確立した後、Smack の通常の認証フローで XMPP アカウントを構成してください。

例はそれぞれの API 世代の範囲内に保ちます。旧来のコンストラクタベースの ConnectionConfiguration の例も同じルーティングの考え方を表していますが、ここで使うのは Smack 4.4 のビルダーというインターフェースです。その考え方を現在の XMPP サービスに適用するために、廃れたメッセージングプロバイダーのホスト名を再現する必要はありません。

関連記事