IM開發【5】 – 使用email作為使用者名稱登陸openfire

來源:互聯網
上載者:User
首頁 » 即時通訊 »
IM開發之使用email作為使用者名稱登入openfireIM開發之使用email作為使用者名稱登入openfire日期:2010-05-25作者:firefish分類:即時通訊閱讀:3,242評論:5

現在有很多網站特別是貼上了“WEB2.0”標籤的網站採用電子郵件地址作為使用者名稱,個中緣由,本文不進行討論。 本文要說的是,當你的網站使用了email作為使用者名稱,而後又基於XMPP協議搭建了一個IM(即時通訊)系統,你希望用網站的使用者帳號直接登入IM(本blog的另外一篇日誌《使用django的使用者帳號登入openfire》對系統的基本搭建有較為詳細的描述,可參考之),這裡面會存在一個小小的問題需要進行一些特殊的處理。

到底是什麼呢?呃,問題就出在email裡的這個”@”符號上。在XMPP中@被定義為有著特殊用途的符號,XMPP的使用者名稱被稱為JID,JID由三個部分組成,像這樣:test@abc.com/resource。你看到了,JID中包含一個@,@前面的是使用者名稱,後面的是所在的域,斜杠後面的resource表示當前使用的用戶端的名字。

所以,很明顯的,email裡的@和JID裡的@衝突了!當然XMPP作為一個牛X的IM協議,它已經考慮到了這一點,它在擴充協議XEP-0106裡進行了定義。

它的解決方案是將使用者名稱裡的特殊字元進行轉義。也就是用戶端在獲得使用者的登入名稱之後,進行一個轉換,如此就可以保證發送到伺服器的JID是沒有衝突的合法字串了。XMPP定義的特殊字元處理@之外還有其它的幾個,有興趣的同學請猛擊這裡圍觀XEP-0106:JID Escaping。

openfire目前已經支援了XEP-0106,函數定義在org.xmpp.packet.JID裡,分別是escapeNode和unescapeNode。用戶端我使用的是gloox的API,在1.0版裡,gloox也增加了對XEP-0106的支援,在jid.cpp裡可以找到這兩個函數。如果你使用的是其它的不支援XEP-0106的用戶端開發包,也很簡單,自己按照協議的定義,寫兩個函數就好了。

有了這兩個函數就好辦了,首先在用戶端取得使用者輸入的email,調用escapeNode函數對字串進行轉義,將轉義後的字串作為使用者名稱發送登入請求。比如使用者名稱是test@gmail.com,轉義後則變成為test\40@gmail.com。

openfire在收到請求之後,會調用驗證函式(請參考本blog的另外一篇日誌《使用django的使用者帳號登入openfire》實現自訂的驗證)authenticate,該函數使用用戶端提供的使用者名稱密碼到使用者表去查詢使用者。那麼我們需要做的是,在查詢資料庫之前,將轉義過的@符號再轉回來即可,像下面這樣:

username = JID.unescapeNode(username);

另外一個處理使用者資訊的類,也就是表ofproperty的provider.user.className所指向的類,該類的loadUser函數,也需要對username進行同樣的處理。

好了,經過這兩步簡單的處理,你現在可以用email作為使用者名稱來登入基於openfire的IM系統了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.