ejabberd extauth с использованием erlang escript

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

У меня все правильно, как описано здесь: https://git.process-one.net/ejabberd/mainline/blobs/raw/2.1.x/doc/dev.html#htoc8

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

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

Я не уверен, где я напортачил.

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


person Abhinav Singh    schedule 25.05.2011    source источник


Ответы (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}, и все готово.

person Dan    schedule 28.05.2011
comment
С тех пор, как я переместил код своего приложения из структуры лампы в Erlang, я больше не использую MySQL, фактически, в настоящее время я просто зависаю с mnesia (учусь на ходу). В настоящее время у меня есть ejabberd, работающий на узле ejabberd @ localhost, и мое собственное приложение otp на узле myapp @ localhost. Пользователь регистрируется через пользовательский интерфейс myapp, который я хочу, чтобы ejabberd использовал для аутентификации. Я не хочу регистрировать или хранить учетные данные в таблице паролей ejabberd mnesia (как это происходит сейчас). Мне просто нужен рабочий процесс внутри myapp @ localhost, который вызывается, когда ejabberd требуется некоторая аутентификация. - person Abhinav Singh; 28.05.2011
comment
Мой ответ 2) позволит вам это сделать. Напишите модуль, который реализует интерфейс ejabberd_auth, но внутренне выполняет вызовы кода вашего приложения через какое-либо сообщение - вы даже можете использовать rpc:call/4, если хотите. - person Dan; 28.05.2011
comment
В конечном итоге я думаю, что лучший способ двигаться вперед - это действительно ejabberd_auth_myway.erl - снова использование rpc: call / 4 действительно полезно (убедитесь, что файл cookie ejabberd erlang синхронизирован с вашим запущенным файлом cookie приложения) - person Abhinav Singh; 29.05.2011
comment
В интересах полного раскрытия информации я сейчас использую extauth себя для своего собственного приложения. Однако я прошу прощения за то, что код аутентификации написан на Java. Если бы это было на Erlang, я бы все равно следовал подходу, который рекомендую выше. - person Dan; 02.08.2011
comment
Привет, Дэн, я больше не использую сценарий extauth. Вместо этого я написал ejabberd_auth_myapp.erl, который теперь общается с моим запущенным приложением всякий раз, когда требуется авторизация. - person Abhinav Singh; 02.08.2011
comment
Это хорошие новости. В моем случае я рассматриваю возможность использования JInterface для обеспечения уровня разделения, чтобы все специфические детали Ejabberd находились в Erlang. Меня беспокоит extauth с точки зрения стабильности - person Dan; 02.08.2011