문제

PHP 스크립트에서 ejabberd 사용자를 만들어야합니다. 또한 새 사용자를 사전 정의 된 공유 명단에 추가 할 수 있어야합니다.

그냥 전화해야하나요 ejabberdctl 사용 exec() 아니면 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

Ejabberdctl 은이 특정 경우에서 가장 쉬운 일입니다. 다른 옵션은 다음과 같습니다.

  • PHP에서 전체 클라이언트 XMPP 구현 (!)

  • Erlang에서 요청을 프록시하는 모듈을 구현하십시오. PHP <-> Erlang 커뮤니케이션은 소켓을 통해 있어야하며 많은 마샬링이 관련 될 것입니다 (!)

다른 팁

내 최종 해결책은 다음과 같습니다.

감사합니다 Jldupont의 조언 저것 ejabberdctl 가장 쉬운 해결책이 될 것입니다. 나는 내가 실행 한 장애물을 통해 눌렀고 작동하는 솔루션을 가지고 있습니다.

기본적으로 Apache의 사용자는 성공적으로 실행할 수있는 올바른 권한이 없습니다. ejabberdctl (그리고 정당한 이유로). 그래서 그것이 작동하기 위해서는 sudo. 하지만... sudo 두 가지 문제를 나타내는 비밀번호가 필요합니다.

  1. Apache 사용자는 비밀번호가 없습니다.
  2. 그랬더라도 PHP에서 입력 할 방법이 없습니다.

솔루션 (우분투 용) - 끝에이 라인을 추가하십시오. /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>';
    }
?>

보안

하나의 명령 만 실행할 수 있더라도 중요한 보안 위험을 제시한다는 점에 유의해야합니다. www-data. 이 접근법을 사용하는 경우 누구나 실행할 수 있도록 어떤 종류의 인증 뒤에 PHP 코드를 보호해야합니다. 명백한 보안 위험 외에도 서비스 거부 공격까지 서버를 열 수 있습니다.

나는 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 파일에서 대역 내 등록을 활성화해야합니다.

{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();
    }

서버에 유효한 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
);

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_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 );

나는 문제를 해결했다 mod_register_web [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: {}

Request example:

curl -XPOST 127.0.0.1:5281/register/new -d 'username=lucky&host=vHost&password=test&password2=test'

적절한 라이브러리 (이미 내 프레임 워크에있는)와 함께 PHP 코드에서 요청을 실행할 수 있습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top