我正在尝试在我的Ejabberd安装中启用外部身份验证。我一直收到以下错误消息。
extauth脚本突然退出,原因是'正常'
我的ejabberd版本是2.1.13。
尝试以下配置,
1. {auth_method,external}。
{extauth_program,“php /tmp/test.php”}。
2. {auth_method,external}。
{extauth_program, “/ TMP / test.php的”}。
3 {auth_method,external}。
%% {extauth_program, “/ TMP / test.php的”}。
以上所有配置都返回相同的错误。
答案 0 :(得分:0)
你的test.php脚本是什么?,你确定它有效吗?也许它正好像错误所说的那样正常终止。 auth脚本应该不会终止,只是继续从stdin运行读取。您可以在此处使用一个示例作为指导 https://github.com/processone/ejabberd/blob/master/examples/extauth/check_pass_null.pl
答案 1 :(得分:0)
花了1天时间试图获得工作ejabberd授权
在从stdin读取时阻塞进程时基本出现问题。它会在请求字符串结束时被阻塞,直到客户端因超时而断开连接
以下是从符号读取符号的非块符号解决方案:
function non_block_read($fd, &$data) {
$read = array($fd);
$write = array();
$except = array();
$result = stream_select($read, $write, $except, 0);
if($result === false) {
throw new Exception('stream_select failed');
}
if($result === 0) return false;
$data.= stream_get_line($fd, 1);
return true;
}
这里的守护进程代码也可以进行终身阅读循环。
$fh = fopen("php://stdin", 'r');
$fhout = fopen("php://stdout", 'w');
$pdo = new PDO('mysql:host='.$host.';dbname='.$db, $user,$pass);
if(!$fh){
die("Cannot open STDIN\n");
}
$aStr='';
$collect=false;
do {
if (!non_block_read($fh,$aStr)) {
if (strlen($aStr) > 0) {
$toAuth = substr(trim($aStr),1);
checkAuth($toAuth,$pdo,$fhout);
$aStr='';
}
else sleep (1);
}
}
while (true);
一些解释:checkAuth - 任何实现' auth'和' isuser'处理程序。
sleep(1) - 逃避CPU负载的简单方法
第一个符号 - 在邮件之前添加的服务符号,它因客户而异,所以我只是将其删除
这是回复代码。回复 - 真实|虚假价值观。
$message = @pack("nn", 2, $result);
fwrite($stdout, $message);
flush();
享受。