我在我的一個項目中使用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