从PHP创建ejabberd用户

And*_*ley 10 php xmpp ejabberd

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

我应该打电话ejabberdctl使用exec()还是有更好的方式?

And*_*ley 10

这是我的最终解决方案:

感谢jldupont的建议,这ejabberdctl将是最简单的解决方案,我抓住了我遇到的障碍,并有一个有效的解决方案.

默认情况下,apache的用户没有成功运行的正确权限ejabberdctl(并且有充分的理由).因此,为了使它工作,你必须调用它sudo.但是...... sudo需要一个密码,这会带来两个问题:

  1. apache用户没有密码.
  2. 即使它确实如此,也无法从PHP输入它.

解决方案(对于Ubuntu) - 在以下末尾添加以下行/etc/sudoers:

www-data ALL= (ejabberd) NOPASSWD: /usr/sbin/ejabberdctl
Run Code Online (Sandbox Code Playgroud)

sudoers文件和ejabberdctl的路径可能因其他Linux发行版而异.这允许apache的user(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>';
    }
?>
Run Code Online (Sandbox Code Playgroud)

安全

重要的是要注意,即使您只允许运行一个命令,这确实会带来很大的安全风险www-data.如果使用这种方法,则需要确保在某种身份验证后面保护PHP代码,这样不仅任何人都可以执行它.除了明显的安全风险之外,它还可能使您的服务器遭受拒绝服务攻击.


Amr*_*eed 6

我在2016年遇到了这个问题,实现这个问题的方法比接受的答案和投票最多的答案要容易得多.

  1. 使用XMPP PHP库,最常见的是:

https://github.com/fabiang/xmpp

  1. 虽然此库不支持添加开箱即用的用户,但您可以非常轻松地扩展它

这是我为添加用户而编写的类:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 您必须在ejabberd.cfg文件中启用带内注册,因为默认情况下它被拒绝:

{access,register,[{allow,all}]}.

最后,这是使用此类的示例代码:

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();
    }
Run Code Online (Sandbox Code Playgroud)

如果服务器没有有效的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
);
Run Code Online (Sandbox Code Playgroud)


jld*_*ont 4

在这种特定情况下,ejabberdctl 是迄今为止最简单的。其他选项是:

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

  • 在 Erlang 中实现一个代理请求的模块:PHP<-->Erlang 通信需要通过套接字进行,并且会涉及大量的封送处理(!)