使用erlang escript的ejabberd extauth

时间:2011-05-25 15:51:36

标签: erlang ejabberd erlang-escript

我在我的一个项目中使用ejabberd,它本身是在erlang中实现的。我有兴趣获得对身份验证流程的访问权限,这样我就可以集成我的用户数据库,而无需在ejabberd中单独注册它们。

我已经掌握了大部分正确的内容,如下所述: https://git.process-one.net/ejabberd/mainline/blobs/raw/2.1.x/doc/dev.html#htoc8

然而,看似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消息传递而不是读取/写入extauth中的stdin / stdout

1 个答案:

答案 0 :(得分:1)

两个想法:

1)您的数据库是否支持SQL?如果是,请按https://support.process-one.net/doc/display/MESSENGER/Using+ejabberd+with+MySQL+native+driver中所述启用{auth_method, odbc}您可以创建视图以将内部数据库结构镜像到ejabberd所期望的内容。

2)你总是可以创建自己的auth_method。如果你已经熟练使用Erlang,那么Ejabberd的代码就不难理解了。我只是在https://github.com/processone/ejabberd/blob/2.1.x/src/ejabberd_auth.erl浏览了ejabberd_auth的代码,实际上它非常简单。只需创建一个名为ejabberd_auth_abhinav的模块,导出必要的函数,然后启用{auth_method, abhinav},就可以了。