从PHP创建ejabberd用户

从PHP创建ejabberd用户,php,xmpp,ejabberd,Php,Xmpp,Ejabberd,我需要从PHP脚本创建一个ejabberd用户。我还需要能够将新用户添加到预定义的共享花名册中 我应该使用exec()调用ejabberdctl,还是有更好的方法?在这种特定情况下,ejabberdctl是最简单的方法。其他选择包括: 在PHP中实现完整的客户端XMPP(!) 在Erlang中实现一个代理请求的模块:PHPErlang通信需要通过套接字,并且需要大量封送(!) 以下是我的最终解决方案: 由于ejabberdctl将是最简单的解决方案,我克服了遇到的障碍,找到了一个有效的解决方案

我需要从PHP脚本创建一个ejabberd用户。我还需要能够将新用户添加到预定义的共享花名册中


我应该使用
exec()
调用
ejabberdctl
,还是有更好的方法?

在这种特定情况下,ejabberdctl是最简单的方法。其他选择包括:

  • 在PHP中实现完整的客户端XMPP(!)

  • 在Erlang中实现一个代理请求的模块:PHPErlang通信需要通过套接字,并且需要大量封送(!)

以下是我的最终解决方案: 由于
ejabberdctl
将是最简单的解决方案,我克服了遇到的障碍,找到了一个有效的解决方案

默认情况下,apache用户没有成功运行
ejabberdctl
的权限(这是有充分理由的)。因此,为了让它工作,您必须使用
sudo
调用它。但是
sudo
需要密码,这会出现两个问题:

  • apache用户没有密码
  • 即使是这样,也无法从PHP输入它
  • 解决方案(针对Ubuntu)-在
    /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年遇到这个问题,有比公认答案和得票最高的答案更容易实现的方法

  • 使用XMPP PHP库,最常见的是:
  • 虽然此库不支持添加开箱即用的用户,但您可以非常轻松地扩展它
  • 下面是我为添加用户而编写的类:

    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"}'