代码之家  ›  专栏  ›  技术社区  ›  Andrew Ensley

从PHP创建EJaberd用户

  •  9
  • Andrew Ensley  · 技术社区  · 15 年前

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

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

    7 回复  |  直到 7 年前
        1
  •  4
  •   jldupont    15 年前

    EJaberdctl是目前为止在这种特定情况下最简单的。其他选项包括:

    • 在php(!)中实现完整的客户机xmpp

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

        2
  •  10
  •   Community CDub    7 年前

    这是我的最终解决方案:

    多亏了 jldupont's advice 那个 ejabberdctl 这是最简单的解决办法,我克服了遇到的障碍,找到了一个有效的解决办法。

    默认情况下,Apache的用户没有成功运行的权限 EJaberdctl公司 (有充分的理由)。所以为了让它工作,你必须打电话给 sudo . 但是… 苏多 需要密码,这会出现两个问题:

    1. Apache用户没有密码。
    2. 即使是这样,也无法从PHP输入。

    解决方案(适用于Ubuntu)-在 /etc/sudoers :

    www-data ALL= (ejabberd) NOPASSWD: /usr/sbin/ejabberdctl
    

    对于其他Linux发行版,sudoers文件和ejaberdctl的路径可能有所不同。这允许Apache的用户( www-data )只运行 EJB 具有提升的权限,无需密码。

    剩下的就是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>';
        }
    ?>
    

    安全性

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

        3
  •  6
  •   Amr H. Abd Elmajeed Judd Lyon    9 年前

    我是在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);
        }
    }
    
    1. 必须在ejabberd.cfg文件中启用带内注册,因为默认情况下会拒绝:

    访问、注册、[允许、全部]。

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

    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
    );
    
        4
  •  1
  •   Abhinav Singh    12 年前

    如果您想在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 $
    
        5
  •  0
  •   richp10    9 年前

    最简单的方法是使用mod_xmlrpc—它允许您使用xmlrpc运行ejabberdctl命令。这很容易与库一起使用,例如:

    https://github.com/gamenet/php-jabber-rpc

    /* 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 );
    
        6
  •  0
  •   Tunaki    9 年前

    我已经解决了这个问题 模块注册网 [ 1 ,请 2 ]它不需要大量的代码,而且,我认为,它足够安全。mod_register_web为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代码执行请求。

        7
  •  0
  •   Fikalefaza    8 年前

    curl-xpost 127.0.0.1:5281/api/register-d'“user”:“lucky”,“host”:“data.com”,“password”:“test”