歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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。

Openfire 的詳細介紹:請點這裡
Openfire 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved