Smack 4.1 Android匿名注册到Openfire

3
我希望使用Android Smack 4.1客户端匿名连接到Openfire服务器,并通过AccountManager注册新用户(用户名="wq",密码="wq"),然后断开连接并以非匿名已注册用户身份登录。 3.1.1 与服务器注册 需要特别注意的是,当一个未注册的实体与服务器交互而不是服务时,必须采取特殊措施。通常,服务器启用带内注册,以便实体可以在Jabber网络中“引导”其参与;这种引导发生在未注册和未经身份验证的实体打开TCP连接到服务器并立即完成与服务器的注册用例,然后使用新注册的身份进行身份验证时。如上所述,当服务器收到关于注册信息的IQ-get时,除非实体已经过身份验证,否则应该假定请求实体未注册。根据本地服务配置,如果未注册的实体在身份验证之前尝试注册太多次,或者如果实体在成功完成注册用例后尝试注册第二个身份,则服务器可能会返回一个stanza错误;如果未注册的实体在等待身份验证之前等待时间过长或在成功完成注册用例后尝试完成身份验证以外的任务,则服务器也可能返回流错误。

连接构建器如下:

xmpptcpConnection = new XMPPTCPConnection(XMPPTCPConnectionConfiguration.builder()
        .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
        .setResource(resource)
        .setHost(localhost) 
        .setServiceName(serviceName)
        .setPort(port)
        .setDebuggerEnabled(true)
        .setSendPresence(true)
        .build()
);

和注册:

        if (password != null && username != null) {
            AccountManager accountManager = AccountManager.getInstance(xmpptcpConnection);
            accountManager.sensitiveOperationOverInsecureConnection(true);
            accountManager.createAccount(username, password);
        }
        else {
            smackError("Username or password wrong");
        }

但是我收到了错误的请求。
05-21 21:34:20.801  19535-19577/com.xmpp D/SMACK﹕ SENT (0): <stream:stream xmlns='jabber:client' to='127.0.0.1' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' xml:lang='en'>
05-21 21:34:20.805  19535-19578/com.xmpp D/SMACK﹕ RECV (0): <?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="127.0.0.1" id="cafb2f97" xml:lang="en" version="1.0"><stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"></starttls><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>ANONYMOUS</mechanism></mechanisms><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><auth xmlns="http://jabber.org/features/iq-auth"/><register xmlns="http://jabber.org/features/iq-register"/></stream:features>
05-21 21:34:20.826  19535-19577/com.xmpp D/SMACK﹕ SENT (0): <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='ANONYMOUS'>=</auth>
05-21 21:34:20.828  19535-19578/com.xmpp D/SMACK﹕ RECV (0): <success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>
05-21 21:34:20.830  19535-19578/com.xmpp D/SMACK﹕ RECV (0): <?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="127.0.0.1" id="cafb2f97" xml:lang="en" version="1.0"><stream:features><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/><session xmlns="urn:ietf:params:xml:ns:xmpp-session"><optional/></session></stream:features>
05-21 21:34:20.838  19535-19577/com.xmpp D/SMACK﹕ SENT (0): <iq id='h3Bqk-3' type='set'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'></bind></iq>
05-21 21:34:20.841  19535-19578/com.xmpp D/SMACK﹕ RECV (0): <iq type="result" id="h3Bqk-3" to="127.0.0.1/cafb2f97"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>cafb2f97@127.0.0.1/cafb2f97</jid></bind></iq>
05-21 21:34:20.843  19535-19564/com.xmpp D/SMACK﹕ User logged (0): cafb2f97@127.0.0.1:5222/cafb2f97
05-21 21:34:20.843  19535-19564/com.xmpp D/SMACK﹕ XMPPConnection authenticated (0)
05-21 21:34:20.844  19535-19577/com.xmpp D/SMACK﹕ SENT (0): <presence id='h3Bqk-5'><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.igniterealtime.org/projects/smack' ver='NfJ3flI83zSdUDzCEICtbypursw='/></presence>
05-21 21:35:20.531  19535-19577/com.xmpp D/SMACK﹕ SENT (0): <iq to='127.0.0.1' id='h3Bqk-6' type='get'><query xmlns='jabber:iq:register'></query></iq>
05-21 21:35:20.535  19535-19578/com.xmpp D/SMACK﹕ RECV (0): <iq type="result" id="h3Bqk-6" from="127.0.0.1" to="cafb2f97@127.0.0.1/cafb2f97"><query xmlns="jabber:iq:register"><username/><password/><email/><name/><x xmlns="jabber:x:data" type="form"><title>XMPP Client Registration</title><instructions>Please provide the following information</instructions><field var="FORM_TYPE" type="hidden"><value>jabber:iq:register</value></field><field var="username" type="text-single" label="Username"><required/></field><field var="name" type="text-single" label="Full name"/><field var="email" type="text-single" label="Email"/><field var="password" type="text-private" label="Password"><required/></field></x></query></iq>
05-21 21:35:20.537  19535-19577/com.xmpp D/SMACK﹕ SENT (0): <iq to='127.0.0.1' id='h3Bqk-8' type='set'><query xmlns='jabber:iq:register'><username>wq</username><email></email><name></name><password>wq</password></query></iq>
05-21 21:35:20.540  19535-19578/com.xmpp D/SMACK﹕ RECV (0): <iq type="error" id="h3Bqk-8" from="127.0.0.1" to="cafb2f97@127.0.0.1/cafb2f97"><query xmlns="jabber:iq:register"><username>wq</username><email/><name/><password>wq</password></query><error code="400" type="modify"><bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>
05-21 21:35:20.542  19535-19564/com.xmpp W/System.err﹕ org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPPError: bad-request - modify
05-21 21:35:20.542  19535-19564/com.xmpp W/System.err﹕ at org.jivesoftware.smack.PacketCollector.nextResultOrThrow(PacketCollector.java:232)
05-21 21:35:20.542  19535-19564/com.xmpp W/System.err﹕ at org.jivesoftware.smack.PacketCollector.nextResultOrThrow(PacketCollector.java:213)
05-21 21:35:20.542  19535-19564/com.xmpp W/System.err﹕ at org.jivesoftware.smackx.iqregister.AccountManager.createAccount(AccountManager.java:272)
05-21 21:35:20.542  19535-19564/com.xmpp W/System.err﹕ at org.jivesoftware.smackx.iqregister.AccountManager.createAccount(AccountManager.java:244)
05-21 21:35:20.543  19535-19564/com.xmpp W/System.err﹕ at com.xmpp.service.SmackConnection.register(SmackConnection.java:349)
05-21 21:35:20.543  19535-19564/com.xmpp W/System.err﹕ at com.xmpp.service.SmackService$1.run(SmackService.java:119)
05-21 21:35:20.543  19535-19564/com.xmpp W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:739)
05-21 21:35:20.543  19535-19564/com.xmpp W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
05-21 21:35:20.543  19535-19564/com.xmpp W/System.err﹕ at android.os.Looper.loop(Looper.java:135)
05-21 21:35:20.543  19535-19564/com.xmpp W/System.err﹕ at com.xmpp.service.SmackService$2.run(SmackService.java:157)
05-21 21:35:20.543  19535-19564/com.xmpp W/System.err﹕ at java.lang.Thread.run(Thread.java:818)

如果我使用非匿名账户连接,就不会出现错误,在连接构建器中只添加了:

.setUsernameAndPassword(username, password)

但我不想使用已注册的另一个帐户来为服务器注册新用户。有没有什么好的解决方案可以通过这种方式传递?

1个回答

3
你需要将connect().login()这个链式结构拆分开来。
        xmpptcpConnection.connect();

        if (anonymous) {
            AccountManager accountManager = AccountManager.getInstance(xmpptcpConnection);
            accountManager.sensitiveOperationOverInsecureConnection(true);
            accountManager.createAccount(username, password)
        }

        xmpptcpConnection.login(); //with old or newly created username, password from shared preferences

1
非常感谢,这救了我的一天! - Fabian Pas
我需要在服务器/Openfire中更改任何设置吗?还是仅此片段就足以创建帐户?@FabianPas - Devendra Singh
我不记得尝试安装注册插件并授予匿名访问权限,但除此之外没有任何其他问题(也许甚至不需要这样)。 - fpopic
1
真的很有帮助..我忘记输入原始密码了..谢谢啊。 - Neo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接