문제
PHP 스크립트에서 ejabberd 사용자를 만들어야합니다. 또한 새 사용자를 사전 정의 된 공유 명단에 추가 할 수 있어야합니다.
그냥 전화해야하나요 ejabberdctl
사용 exec()
아니면 더 좋은 방법이 있습니까?
해결책
Ejabberdctl 은이 특정 경우에서 가장 쉬운 일입니다. 다른 옵션은 다음과 같습니다.
PHP에서 전체 클라이언트 XMPP 구현 (!)
Erlang에서 요청을 프록시하는 모듈을 구현하십시오. PHP <-> Erlang 커뮤니케이션은 소켓을 통해 있어야하며 많은 마샬링이 관련 될 것입니다 (!)
다른 팁
내 최종 해결책은 다음과 같습니다.
감사합니다 Jldupont의 조언 저것 ejabberdctl
가장 쉬운 해결책이 될 것입니다. 나는 내가 실행 한 장애물을 통해 눌렀고 작동하는 솔루션을 가지고 있습니다.
기본적으로 Apache의 사용자는 성공적으로 실행할 수있는 올바른 권한이 없습니다. ejabberdctl
(그리고 정당한 이유로). 그래서 그것이 작동하기 위해서는 sudo
. 하지만... sudo
두 가지 문제를 나타내는 비밀번호가 필요합니다.
- Apache 사용자는 비밀번호가 없습니다.
- 그랬더라도 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 년 에이 질문을 겪었습니다. 받아 들여진 답변과 최고 투표보다 훨씬 쉬운 방법이 있습니다.
- XMPP PHP 라이브러리를 사용하십시오. 가장 일반적인 것은 다음과 같습니다.
https://github.com/fabiang/xmpp
- 이 라이브러리는 상자 밖에서 사용자를 추가하는 것을 지원하지 않지만 쉽게 확장 할 수 있습니다.
다음은 사용자를 추가하기 위해 쓴 수업입니다.
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);
}
}
- 기본적으로 거부되므로 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"}'