Ejabberd Extauth с использованием Erlang Escript

Я использую ejabberd в одном из моих проектов, который сам реализован в erlang. Я заинтересован в получении доступа к потоку аутентификации, чтобы я мог интегрировать свою пользовательскую базу данных без необходимости регистрировать их отдельно в ejabberd.

Я правильно понял большинство вещей, как описано здесь: https://git.process-one.net/ejabberd/mainline/blobs/raw/2.1.x/doc/dev.html

Однако, по-видимому, ejabberd никогда не получит ответ от моего escript. Ниже приведена часть кода, отвечающая за отправку resopnse:

process_data(["auth", _User, _Server, _Pass]) ->
    BB = <<1:16>>, %% result code 1 coded as short
    AA = byte_size(BB), %% AA is byte length of result
    Bin = <<AA:16,BB/binary>>, %% finally packing AA as short along with BB
    io:put_chars(Bin);

Из моих логов я в итоге отправляю:

=DEBUG== 2011-05-25 21:05:15 == <0.2.0> == extauth:53 ===
sent <<0,2,0,1>>

что в точности похоже на то, что я делал в PHP:

fwrite($out, pack("nn", 2, $result_code));

Я не уверен, где я облажался.

Также мне интересно, есть ли лучший способ интегрировать мою пользовательскую базу данных, так как мое приложение само по себе находится на erlang, и я, вероятно, хотел бы воспользоваться передачей сообщений erlang вместо чтения / записи stdin / stdout внутри extauth

1 ответ

Решение

Две идеи:

1) Ваша база данных поддерживает SQL? Если это так, включите {auth_method, odbc} как описано в https://support.process-one.net/doc/display/MESSENGER/Using+ejabberd+with+MySQL+native+driver Вы можете создавать представления, отражающие внутреннюю структуру БД в соответствии с ожиданиями ejabberd.

2) Вы всегда можете создать свой собственный auth_method. Если вы уже разбираетесь в Erlang, код Ejabberd нетрудно понять. Я просто посмотрел код для ejabberd_auth по адресу https://github.com/processone/ejabberd/blob/2.1.x/src/ejabberd_auth.erl и на самом деле это довольно просто. Просто создайте модуль под названием ejabberd_auth_abhinav, экспортируйте необходимые функции, а затем включите {auth_method, abhinav} и ты в порядке.

Другие вопросы по тегам