2011-05-25 26 views
1

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

我有大部分的东西吧如下所述: 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消息传递而不是读/写stdin/stdout在extauth内

回答

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的代码不难理解。我只是浏览了ejabberd_auth的代码https://github.com/processone/ejabberd/blob/2.1.x/src/ejabberd_auth.erl,实际上它非常简单。只需创建一个名为ejabberd_auth_abhinav的模块,导出必要的功能,然后启用{auth_method, abhinav},您就可以走了。

+0

自从我将我的应用程序代码从灯结构移动到erlang之后,我不再使用MySQL,事实上我现在只是挂着mnesia(随我学习)。目前我有节点ejabberd @ localhost和myapp @ localhost节点上运行的ejabberd和我自己的otp应用程序。用户通过myapp的UI界面注册,我最终希望ejabberd用于认证。我不想在ejabberd mnesia passwd表中注册或保留凭证(现在就是这种情况)。我只想在ejabberd需要某种身份验证时调用myapp @ localhost中的工作流。 – 2011-05-28 08:16:02

+1

我的回答2)可以让你做到这一点。编写一个实现'ejabberd_auth'接口的模块,但是通过一些消息在内部调用应用程序的代码 - 如果需要的话,甚至可以使用'rpc:call/4'。 – Dan 2011-05-28 15:27:29

+0

最终我认为最好的方法是ejabberd_auth_myway.erl - 再次使用rpc:call/4确实有帮助(确保ejabberd erlang cookie与正在运行的应用程序cookie同步) – 2011-05-29 15:43:45