Asmack/Openfire 401 错误

Posted

技术标签:

【中文标题】Asmack/Openfire 401 错误【英文标题】:Asmack/Openfire 401 error 【发布时间】:2011-10-21 11:21:58 【问题描述】:

我正在尝试使用 asmack 在 android 上编写一个简单的 XMPP 应用程序,但我遇到了一个问题,我无法登录到多个 jabber 服务器。例如,我无法登录到我的测试 Openfire 服务器,尽管代码在 jabber.org 帐户上运行良好。

登录代码:

public void login() throws XMPPException

    if (connection != null && connection.isConnected())
    
        try 
        
            Random generator = new Random();
            int resource_int = generator.nextInt();
            connection.login(USERNAME, PASSWORD, 
                             "Smack_" + Integer.toString(resource_int));
         
        catch (XMPPException e) 
        
            e.printStackTrace();
            connection.disconnect();
            setConnection(null);
            throw e;
        
        Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.accept_all);
    

正如我所说,它适用于 jabber.org,但 Openfire 返回 not-authorized(401) 错误。我该如何解决?

【问题讨论】:

尝试在登录时删除您的资源参数。 【参考方案1】:

我从未使用过 Openfire,但我确定某处有一个日志文件 - 你可以发布它吗?

Android 中的 IIRC 某些安全功能(不确定是否用于 SSL 或 TLS)与 Smack 或 Asmack 不兼容,也许这就是问题所在。在这种情况下,有一种方法可以通过使用自己的 Socket 连接(而不是 Smack 包含的 SSL 功能)来解决它 - 要验证这一点,您可以将(XMPP 相关)代码移植到 PC 并使用标准 Smack 库。

另一点是,Android 有不同的 Smack 端口。我个人使用 Beem 项目中的 Asmack 端口(因为最初的 Asmack 有一些问题 - 但我不记得是哪些问题了......)

但仍然......没有更多信息我只能猜测。

【讨论】:

他的问题是它可以在一台服务器上运行,但不能在另一台服务器上运行。不太可能是客户端的问题,因为它在两种情况下都应该失败。 不一定...可能服务器需要不同的登录机制。在 Asmack 中,您可以启用调试模式 (ConnectionConfiguration.setDebuggerEnabled(bool)),以便您可以在 LogCat 中跟踪节,也许在那里您可以找到有用的区别。【参考方案2】:

您确定您在 OpenFire 服务器上拥有相同的帐户和密码吗?尝试使用与现有 XMPP 客户端相同的用户名和密码登录到您的服务器。将 Android 完全排除在外,并确保您可以先登录两台服务器。

【讨论】:

以上是关于Asmack/Openfire 401 错误的主要内容,如果未能解决你的问题,请参考以下文章

android asmack+openfire怎么发离线文件

Android asmack openfire接收文件

语音识别惨遭失败:Bing Speech API / token 中的错误状态码 401

Android基于xmpp的即时通讯应用

401的错误分析

HTTP错误代码