未使用smack 4.1.1授权SASLException

时间:2015-06-12 06:53:40

标签: android xmpp smack

使用Smack 4.1.1登录jabber服务器时遇到问题。我已成功连接到jabber服务器,但在我尝试登录时,它会失败并出现异常。我搜索了很多天,但似乎没有解决方案在SO或其他任何地方工作。

XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();                        builder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
   // builder.setUsernameAndPassword(myUserName,password);
    builder.setServiceName(jabberServer);
    builder.setHost(jabberServer);
    builder.setPort(5222)
    builder.setDebuggerEnabled(true);

    AbstractXMPPConnection connection = new XMPPTCPConnection(builder.build());
    connection.connect();
    connection.login(myUserName,password);
    //connection.login();

我尝试了两种方法,一次是设置用户名和密码到构建器,一次是在登录时设置它。没有任何作用,登录总是会失败,但有以下例外:

SASLErrorException: SASLError using PLAIN: not-authorized

请注意,堆栈跟踪的其余部分在这里并不重要,所以我不发布它。

我试过的:

  • 使用服务器和服务名称 jabber.org ,也尝试使用 jabber.de

  • 将用户名设置为简单字符串 userName ,同时使用 userName@jabber.org (或@ jabber.de)

  • 我的setDebuggerEnabled(false)上的
  • setCompressionEnabled(false)setCompressionEnabled(true)builder

  • 还配置SASL机制:

    SASLAuthentication.unBlacklistSASLMechanism( “普通纸”); SASLAuthentication.blacklistSASLMechanism( “DIGEST-MD5”);

之前 connect()之前 login()

  • setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);
  • setSecurityMode(ConnectionConfiguration.SecurityMode.required);
  • setSecurityMode(ConnectionConfiguration.SecurityMode.ifpossible);

所有这些尝试我也完全退出。

我已经google了很多,发现这是旧Smack库的一个错误,但应该在4.0以上的新Smack版本中修复。所以我不得不假设这个错误不是Smack中的错误。

我认为可能会出现此错误,因为我使用的帐户未注册,因此我尝试在使用smacks AccountManager登录之前注册新帐户。我在allowEmptyOrNullUserNames()上设置了builder(),但注册新帐户会引发service not available exception,所以我只是假设, jabber.org上无法注册AccountManager jabber,de

我也完全遵循文档步骤和Smack的README指南:

https://www.igniterealtime.org/builds/smack/docs/latest/documentation/

https://github.com/igniterealtime/Smack/wiki/Smack-4.1-Readme-and-Upgrade-Guide

问题

  1. 我缺少什么?
  2. 它仍然是一个错误,如果是,如何自己解决?
  3. 帐户是否必须注册帐户,或者如果jabber服务器上不存在用户,是否会自动完成?
  4. 是否有人可以使用https://xmpp.org/xmpp-software/servers/中的其他免费XMPP服务器指导我找到正确的方向(代码示例?)?
  5. 我读过关于使用更好的一些夜间版本,例如 smack-SNAPSHOT-2015-06-07 从点燃实时下载,但我应该如何将每晚构建集成到我的Android Studio项目中?使用依赖项(如果是,如何?),使用导入模块?
  6. 在这个已经成功修复此问题的整个开发者世界中,是否有人在那里?我很感激任何信息...

    更新

    我现在只是尝试通过互联网在jabber.de上注册。然后我使用我的帐户通过我的应用程序和IT工作登录! 。所以似乎问题确实是没有注册帐户。我看到注册jabber.org自2013年以来因为一些攻击而被禁用,从那时起没有任何事情发生。我认为jabber.org的服务不再可用。有了jabber.de,我现在已成功进入。

    我已经注册了这样的新帐户:

    AccountManager accountManager = AccountManager.getInstance(connection);
    Map<String, String> map = new HashMap<String, String>();
    map.put("username", myUserName);
    map.put("password", myPassword);
    map.put("email", myEmail);
    accountManager.createAccount(myUserName, myPassword, map);
    

    和另一种方式:

    AccountManager accountManager = AccountManager.getInstance(connection);
    accountManager.createAccount(myUserName, myPassword);
    

    我尝试通过设置allowEmptyOrNullUsernames()(连接成功)来配置没有userName和密码的连接,但是抛出了service not available exception

    那么,新的问题是,如何注册成功的新账户?我是否遗漏了配置中的某些内容,例如允许注册帐户?

    第二次更新

    事实证明,由于过多的垃圾邮件暴力,最免费的服务器禁用了带内注册。因此,在最开放的免费xmpp服务器上不再可能。现在的问题是,如何通过app注册这种情况?我读了一些关于Web服务的内容,这会是一个解决方案吗?

2 个答案:

答案 0 :(得分:1)

我通过联系jabber.de提供商团队发现他们禁用了带内注册。这意味着,无法在应用程序内创建新帐户(可能只有在他们自己开发应用程序并在其中放置一些安全机制时)。还发现最免费的xmpp服务器不允许带内注册,他们已经完成了它,因为太多的垃圾邮件暴力和试图注册的应用程序的攻击。

在禁用带内注册的服务器上,您必须将用户引导至服务器网站,并且必须通过网络注册。我在上面的示例中所做的一切都是正确的方法,适用于未禁用带内注册的服务器。

但警告所有尝试类似事情的人:不要依赖带内注册,如果你想提供一个不属于你自己的开放免费服务器,你必须负责这个注册。非带内禁用的服务器将来可能会这样做,如果您想让用户注册,那么如果注册失败,您必须有第二种可能性。

答案 1 :(得分:0)

我有两个不同的原因:

  1. 服务名称不正确
  2. 我试图运行连接并登录“主线程”,尝试创建一个新线程:
  3. 在您的连接方法中:

    Thread t = new Thread(new Runnable() {
    
        @Override
        public void run() {
           //code for connection here
    
        }
    });
    t.start();