PHP スクリプトから ejabberd ユーザーを作成する必要があります。また、事前定義された共有名簿に新しいユーザーを追加できるようにする必要もあります。
ejabberdctl
使用して電話するだけexec()
ですか、それとももっと良い方法がありますか?
最も簡単な解決策となるjldupontのアドバイスのおかげでejabberdctl
、私は遭遇した障害を乗り越え、実用的な解決策を手に入れました。
デフォルトでは、apacheのユーザーは正常に実行するための適切な特権を持っていませんejabberdctl
(そして正当な理由があります)。したがって、それが機能するためには、で呼び出す必要がありますsudo
。しかし...sudo
パスワードが必要です。これには2つの問題があります。
解決策(Ubuntuの場合)-この行を最後に追加します/etc/sudoers
:
www-data ALL= (ejabberd) NOPASSWD: /usr/sbin/ejabberdctl
sudoersファイルとejabberdctlへのパスは、他のLinuxディストリビューションでは異なる場合があります。これにより、apacheのユーザー(www-data
)はejabberdctl
、昇格された特権でのみ、パスワードを必要とせずに実行できます。
残っているのはPHPコードだけです。
<?php
$username = 'tester';
$password = 'testerspassword';
$node = 'myserver.com';
exec('sudo -u ejabberd /usr/sbin/ejabberdctl register '.$username.' '.$node.' '.$password.' 2>&1',$output,$status);
if($output == 0)
{
// Success!
}
else
{
// Failure, $output has the details
echo '<pre>';
foreach($output as $o)
{
echo $o."\n";
}
echo '</pre>';
}
?>
によって実行できるコマンドは1つだけですが、これには重大なセキュリティリスクがあることに注意してくださいwww-data
。このアプローチを使用する場合は、PHPコードを何らかの認証の背後で保護して、だれでも実行できるようにする必要があります。明らかなセキュリティリスクを超えて、サーバーがサービス拒否攻撃にさらされる可能性があります。
私は2016年にこの質問に出くわしました。これを実装するには、受け入れられた回答と最も投票数の多い回答よりもはるかに簡単な方法があります。
https://github.com/fabiang/xmpp
ユーザーを追加するために私が書いたクラスは次のとおりです。
use Fabiang\Xmpp\Util\XML;
/**
* Register new user
* @param string $username
* @param string $password
* @param string $email
* @package XMPP\Protocol
* @category XMPP
*/
class Register implements ProtocolImplementationInterface
{
protected $username;
protected $password;
protected $email;
/**
* Constructor.
*
* @param string $username
* @param string $password
* @param string $email
*/
public function __construct($username, $password, $email)
{
$this->username = $username;
$this->password = $password;
$this->email = $email;
}
/**
* Build XML message
* @return type
*/
public function toString()
{
$query = "<iq type='set' id='%s'><query xmlns='jabber:iq:register'><username>%s</username><password>%s</password><email>%s</email></query></iq>";
return XML::quoteMessage($query, XML::generateId(), (string) $this->username, (string) $this->password, (string) $this->email);
}
}
{アクセス、登録、[{許可、すべて}]}。
最後に、このクラスを使用するためのサンプル コードを次に示します。
private function registerChatUser($name, $password, $email)
{
$address = 'tcp://yourserverip:5222';
$adminUsername = 'youradmin';
$adminPassword = 'youradminpassword';
$options = new Options($address);
$options->setUsername($adminUsername)->setPassword($adminPassword);
$client = new Client($options);
$client->connect();
$register = new Register($name, $password, $email);
$client->send($register);
$client->disconnect();
}
サーバーに有効な SSL 証明書がない場合、ライブラリ呼び出しは失敗します。有効な証明書を配置するか、SocketClient.php のこの部分を以下のスニペットに置き換えます。
// call stream_socket_client with custom error handler enabled
$handler = new ErrorHandler(
function ($address, $timeout, $flags) {
$options = [
'ssl' => [
'allow_self_signed' => true,
'verify_peer_name' => false,
],
];
$context = stream_context_create($options);
return stream_socket_client($address, $errno, $errstr, $timeout, $flags, $context);
},
$this->address,
$timeout,
$flags
);
この特定のケースでは、ejabberdctl が最も簡単です。その他のオプションは次のとおりです。
PHP で完全なクライアント XMPP を実装する (!)
リクエストをプロキシする Erlang でモジュールを実装します。PHP<-->Erlang 通信はソケットを介する必要があり、多くのマーシャリングが必要になります (!)
XMPP プロトコル内で PHP を使用してこれを行うクリーンで安全な方法が必要な場合は、このサンプル スクリプトregister_user.phpを使用することをお勧めします。これは、 Jaxl PHP ライブラリ内にある例です。
Jaxl ライブラリをダウンロードして、次のように使用します。
JAXL $ php examples/register_user.php localhost
Choose a username and password to register with this server
username:test_user
password:test_pass
registration successful
shutting down...
JAXL $
mod_register_web [ 1 , 2 ]で問題を解決しました。大量のコードを必要とせず、十分に安全だと思います。mod_register_web は、新しいユーザーを登録するためのシンプルな POST フォームを備えた html ページを提供します。
別の http リスナー (私の場合はポート 5281) でモジュールを有効にします。「ip」パラメーターを使用して、このポートをローカル リクエストでのみ使用できるようにします。
listen:
port: 5280
module: ejabberd_http
web_admin: true
http_bind: true
## register: true
ip: "127.0.0.1" # Only local requests allowed for user registration
port: 5281
module: ejabberd_http
register: true
modules:
mod_register_web: {}
リクエスト例:
curl -XPOST 127.0.0.1:5281/register/new -d 'username=lucky&host=vHost&password=test&password2=test'
リクエストは、適切なライブラリを使用してphpコードから実行できます(これはすでに私のフレームワークにありました)。