2011-05-25 55 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