我在我的一个项目中使用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内
自从我将我的应用程序代码从灯结构移动到erlang之后,我不再使用MySQL,事实上我现在只是挂着mnesia(随我学习)。目前我有节点ejabberd @ localhost和myapp @ localhost节点上运行的ejabberd和我自己的otp应用程序。用户通过myapp的UI界面注册,我最终希望ejabberd用于认证。我不想在ejabberd mnesia passwd表中注册或保留凭证(现在就是这种情况)。我只想在ejabberd需要某种身份验证时调用myapp @ localhost中的工作流。 – 2011-05-28 08:16:02
我的回答2)可以让你做到这一点。编写一个实现'ejabberd_auth'接口的模块,但是通过一些消息在内部调用应用程序的代码 - 如果需要的话,甚至可以使用'rpc:call/4'。 – Dan 2011-05-28 15:27:29
最终我认为最好的方法是ejabberd_auth_myway.erl - 再次使用rpc:call/4确实有帮助(确保ejabberd erlang cookie与正在运行的应用程序cookie同步) – 2011-05-29 15:43:45