从PHP创建ejabberd用户
我需要从PHP脚本创建一个ejabberd用户。我还需要能够将新用户添加到预定义的共享花名册中从PHP创建ejabberd用户,php,xmpp,ejabberd,Php,Xmpp,Ejabberd,我需要从PHP脚本创建一个ejabberd用户。我还需要能够将新用户添加到预定义的共享花名册中 我应该使用exec()调用ejabberdctl,还是有更好的方法?在这种特定情况下,ejabberdctl是最简单的方法。其他选择包括: 在PHP中实现完整的客户端XMPP(!) 在Erlang中实现一个代理请求的模块:PHPErlang通信需要通过套接字,并且需要大量封送(!) 以下是我的最终解决方案: 由于ejabberdctl将是最简单的解决方案,我克服了遇到的障碍,找到了一个有效的解决方案
我应该使用
exec()
调用ejabberdctl
,还是有更好的方法?在这种特定情况下,ejabberdctl是最简单的方法。其他选择包括:
- 在PHP中实现完整的客户端XMPP(!)
- 在Erlang中实现一个代理请求的模块:PHPErlang通信需要通过套接字,并且需要大量封送(!)
ejabberdctl
将是最简单的解决方案,我克服了遇到的障碍,找到了一个有效的解决方案
默认情况下,apache用户没有成功运行ejabberdctl
的权限(这是有充分理由的)。因此,为了让它工作,您必须使用sudo
调用它。但是sudo
需要密码,这会出现两个问题:
/etc/sudoers
末尾添加这一行:
www-data ALL= (ejabberd) NOPASSWD: /usr/sbin/ejabberdctl
对于其他Linux发行版,sudoers文件和ejabberdctl的路径可能会有所不同。这允许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>';
}
?>
安全
需要注意的是,即使您只允许
www-data
运行一个命令,这也会带来严重的安全风险。如果您使用这种方法,您需要确保在某种身份验证之后保护PHP代码,以便不仅仅是任何人都可以执行它。除了明显的安全风险之外,它还可能使您的服务器面临拒绝服务攻击。如果您希望在XMPP协议中使用PHP实现这一点,那么我建议使用此示例脚本。这是一个可以在PHP库中找到的示例
下载Jaxl库并按如下方式使用:
/* Add user to Jabber */
use \GameNet\Jabber\RpcClient;
use \GameNet\Jabber\Mixins\UserTrait;
$rpc = new RpcClient([
'server' => 'jabber.org:4560',
'host' => 'myhost.org',
'debug' => false,
]);
$result=$rpc->createUser( $username, $password );
最简单的方法是使用mod_xmlrpc,它允许您使用xmlrpc运行ejabberdctl命令。这很容易与库一起使用,例如:
我在2016年遇到这个问题,有比公认答案和得票最高的答案更容易实现的方法
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中的此部分
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: {}
我已经用mod_register_web解决了这个问题。它不需要大量的代码,而且我认为足够安全。mod_register_web提供带有简单POST表单的html页面来注册新用户 在单独的http侦听器下启用模块(在我的示例中为端口5281)。使此端口仅可用于带有“ip”参数的本地请求
curl -XPOST 127.0.0.1:5281/register/new -d 'username=lucky&host=vHost&password=test&password2=test'
请求示例:
curl -XPOST 127.0.0.1:5281/api/register -d '{"user":"lucky","host":"data.com","password":"test"}'
可以使用适当的库(已经在我的框架中)从php代码执行请求
要应用到php,可以使用标准curl
,上面的代码是未发布的ejabberd文档中包含的最新curl代码
我只是从doc ejabber中应用它并对其进行分析,然后将其调整为在ejabberd config xml上创建的ejabberd url路径Hmmmm。。。我似乎在有限的特权(或其他)方面遇到了麻烦。每当我尝试使用
exec()
运行ejabberdctl
命令时,我都会得到这样一个结果:erlexec:HOME必须设置为Ok-解决了它。我很快就会发布我的解决方案。感谢您的建议。您能否提供链接或源代码,从PHP脚本创建ejabberd用户。将sudo行更改为www data ALL=(ejabberd)NOPASSWD:/usr/sbin/ejabberdctl
,以便ejabberdctl
不以root用户身份运行,而是以用户身份运行。在你的代码中执行ejabberdctl
:sudo-u ejabberd ejabberdctl
。我在linux中面临同样的问题,(错误:sh:/bin/su:Permission denied),解决方案(针对Ubuntu)-在/etc/sudoers:How to add in linux?@Purushottam:Ubuntu是基于debian的linux发行版。每个linux发行版都有自己的做事方式。我建议您在特定的linux发行版中搜索sudoers文件的位置。我已经尝试过谷歌搜索,但仍然无法做到。我正在使用CentOS linux发行版,您能帮助我吗?出现错误,例如,您试图运行“ejabberdctl”,这需要管理权限,但需要更多信息才能执行此操作。身份验证为“根”密码:密码:密码:我试图做同样的事情,但得到如下错误。未捕获异常“Fabiang\Xmpp\exception\TimeoutException”,在****/***/vendor/Fabiang/Xmpp/src/Connection/AbstractConnection.php:308I收到此错误无法启用加密致命错误:未捕获异常“Fabiang\Xmpp\exception\ErrorException”@lakshmaji我想这可以通过答案的最后一步是更新SocketClient的部分。php@AmrH.AbdelMajeed,我已将现有代码替换为您答案中的最后一步,相同错误,这不是为我创建任何问题,但它不会在ejabberd中创建任何用户,所以您有任何调试点吗?我尝试了上面的一个,但它抛出了传递给fXmlRpc\Transport\HttpAdapterTransport的以下错误参数1::u construct()必须是Http\MessageFactory的实例,象牙\HttpAdapter的实例
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'
curl -XPOST 127.0.0.1:5281/api/register -d '{"user":"lucky","host":"data.com","password":"test"}'