Smack XMPP:无法登录到 openfire 服务器:“SASLErrorException: SASLError using DIGEST-MD5: not-authorized”

Posted

技术标签:

【中文标题】Smack XMPP:无法登录到 openfire 服务器:“SASLErrorException: SASLError using DIGEST-MD5: not-authorized”【英文标题】:Smack XMPP: Can't login to openfire server: "SASLErrorException: SASLError using DIGEST-MD5: not-authorized" 【发布时间】:2015-03-19 17:19:27 【问题描述】:

我正在尝试创建一个基本连接并登录到我已安装的 Openfire 服务器。我通过 Openfire Web 管理界面创建的用户数据库中有以下用户:

User: user
Password: 12345678

我可以很好地连接到服务器,因为连接在我的 sout 中返回 true。问题是当它尝试登录时出现以下错误:

org.jivesoftware.smack.sasl.SASLErrorException: SASLError using DIGEST-MD5: not-authorized

我有以下代码:

private XMPPConnection connection;

public void connect(String serverIP) 
    try 

        System.setProperty("smack.debugEnabled", "true");
        ConnectionConfiguration config = new ConnectionConfiguration(serverIP, 5223);
        config.setDebuggerEnabled(true);
        config.setSocketFactory(new DummySSLSocketFactory());    
        config.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);
        config.setCompressionEnabled(true);
        connection = new XMPPTCPConnection(config);
        connection.connect();

        System.out.println("Connected: " + connection.isConnected());
        connection.login("user", "12345678");
        System.out.println("Logged in: " + connection.isAuthenticated());

     catch (SmackException | IOException | XMPPException ex) 
        ex.printStackTrace();
    


public static void main(String[] args) 
    connectionHandler test = new connectionHandler();
    test.connect("localhost");

如果有人能纠正我做错的事情,我将不胜感激。

我也尝试过使用电子邮件的用户名

user@localhost.com
or
user@localhost

【问题讨论】:

【参考方案1】:

我终于找到了答案。问题(甚至可能不是问题)是未在服务器配置中设置身份验证方法,并且默认情况下允许所有方法。在 java 中选择的第一个似乎是导致错误的 DIGEST-MD5。为了解决这个问题,我添加了:

<sasl>
    <mechs> PLAIN </mechs>
</sasl>

在服务器的配置文件夹中找到的 openfire.xml 的最后一个结束标记之前。这也可以在ofproperty 数据库表中为名为@9​​87654323@ 的列更改。

希望这对将来的某人(可能是我)有所帮助。

附:如果不使用 SSL(默认为 5223 端口),这是不安全的

【讨论】:

这是正确的实现。我正在使用 smack 4.1 和 open fire 3.10.1 。已经卡了几个小时。让我们投票来拯救某人! 只有在了解 SASL PLAIN 的安全隐患时才应使用它。 @Flow 同意了。在现实世界的示例中,您绝对应该使用更加密的方法。我选择 SASL PLAIN 的原因是因为这是一个内部应用程序,没有外部网络访问权限。【参考方案2】:

SASLError using DIGEST-MD5: not-authorized

这很可能是因为您没有在 ConnectionConfiguration 中配置正确的 XMPP 域(/服务名称)。 DIGEST-MD5 不仅会在用户名或密码错误的情况下失败,而且在使用错误的 XMPP 域时也会失败。

【讨论】:

以上是关于Smack XMPP:无法登录到 openfire 服务器:“SASLErrorException: SASLError using DIGEST-MD5: not-authorized”的主要内容,如果未能解决你的问题,请参考以下文章

XMPP 注销(Smack API)

使用 Openfire 服务器和 XMPP(SMACK)客户端的 Android 聊天应用程序 [关闭]

使用 xmpp + smack + openfire 在 android 中阻止用户

Android基于XMPP Smack及Openfire学习笔记

我在使用 smack 4.2 Openfire 创建 XMPP 客户端时遇到问题

Android 基于XMPP Smack openfire 开发的聊天室