【问题标题】:ejabberd extauth using erlang escript使用erlang escript的ejabberd extauth
【发布时间】:2011-09-01 21:45:56
【问题描述】:

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

我已经完成了这里描述的大部分事情: https://git.process-one.net/ejabberd/mainline/blobs/raw/2.1.x/doc/dev.html#htoc8

但是,似乎 ejabberd 从未收到我的 escript 的响应。下面是负责发送响应的部分代码:

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

【问题讨论】:

    标签: erlang ejabberd erlang-escript


    【解决方案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} 即可。

    【讨论】:

    • 自从我将我的应用程序代码从 Lamp 结构转移到 erlang 之后,我就不再使用 MySQL,事实上我目前只是在使用 mnesia(边做边学)。目前,我在节点 ejabberd@localhost 上运行 ejabberd,在节点 myapp@localhost 上运行我自己的 otp 应用程序。用户通过 myapp 的 UI 界面注册,我最终希望 ejabberd 用于身份验证。我不想在 ejabberd mnesia passwd 表中注册或保留凭据(现在就是这种情况)。我只想在 ejabberd 需要一些身份验证时调用 myapp@localhost 中的工作流。
    • 我的回答 2) 将允许您这样做。编写一个实现 ejabberd_auth 接口的模块,但在内部通过一些消息调用您的应用程序代码 - 如果您愿意,您甚至可以使用 rpc:call/4
    • 最后我认为最好的前进方式确实是 ejabberd_auth_myway.erl - 再次使用 rpc:call/4 确实很有帮助(确保 ejabberd erlang cookie 与您正在运行的应用程序 cookie 同步)
    • 为了全面披露,我现在自己使用extauth 自己的应用程序。不过,我的借口是验证代码是用 Java 编写的。如果是在 Erlang 中,我仍然会遵循我上面推荐的方法。
    • 嗨,Dan,我不再使用 extauth 脚本。相反,我编写了 ejabberd_auth_myapp.erl,它现在在需要身份验证时与我正在运行的应用程序对话。
    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2015-07-01
    • 2015-12-17
    • 2016-11-30
    相关资源
    最近更新 更多