qxmpp登錄openfire時的“Not Authorized”問題

問題

最近在一個linux機器上建了一個openfire,hostname爲“A”,用spark的時候,在server處填寫對方IP可以登錄
但發現用qxmpp以“username@IP/resource”爲JID登錄時返回“Not Authorized”,但如果用“username@hostname/resource”爲JID,則返回“socket error”
之前用“username@hostname/resource”爲JID訪問本地windows上架設的openfire沒問題。


解決
1、對Java不熟,想請同事調一下spark是如何登錄成功的,因爲種種原因未成
2、短時間內沒在openfire日誌裏找到spark登錄時的JID
3、仔細分析qxmpp的底層代碼,發現了socket連接和收發數據的地方,看到了最基本的xmpp通信xml
4、和同事討論,同事建議修改本地host文件,將hostname映射成IP。當時沒有接受這個建議,覺得不是最終解決辦法,因爲不可能去用戶機器上修改host。(但事後看,這種做法是對調試有幫助的)
5、對比同一程序登錄本地openfire和linux上的openfire過程中與服務器的xml。前面還能看懂,後面的就多是類似加密過的字符串,看了也沒用。不過這個調研中最有價值的收穫就是發現當和服務器建立socket連接後,服務器會返回hostname。
6、用wireshark分別收集spark登錄linux上的openfire和自己程序登錄同一服務器的數據包。同樣,前面還能看,後面看不懂
7、無奈之下,用“Not Authorized openfire”之類的關鍵字搜索,發現了一些類似問題的資料
8、開始沒看懂,後來忽然意識到,登錄openfire肯定要用“username@hostname/resource”,而在此之前,一定要保證和服務器建立socket連接。借這種思路,先在qxmpp源代碼裏硬編碼建立socket連接時所用的host爲linux機器的ip,而登錄還是用“username@hostname/resource”,成功。

備註
1、這種改法是權宜之計,感覺真正的做法應該利用建立連接時獲得的hostname組成JID。
發佈了132 篇原創文章 · 獲贊 10 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章