Smack 4.1 Android匿名注册到Openfire

时间:2015-05-22 10:42:17

标签: android tcp xmpp openfire smack

我希望匿名连接到Android Smack 4.1客户端的openfire服务器并使用AccountManager注册新用户(用户名=" wq",密码=" wq")然后断开连接以非匿名注册用户身份登录。

3.1.1 Registration with a Server

  

未注册实体与之互动时必须特别小心   服务器而不是服务。通常,服务器启用带内   注册,以便实体可以" bootstrap"他们参与   Jabber网络;这种引导发生在未注册的时候   和未经身份验证的实体打开与服务器的TCP连接   然后立即完成与服务器的注册用例   使用新注册的身份进行身份验证。如上所述,当一个   服务器收到IQ-get的注册信息,它应该是   假设请求实体未注册,除非该实体   已经过身份验证。根据本地服务提供,a   如果未注册,服务器可能会返回节错误   实体在验证之前尝试注册太多次,或者是否   实体成功后尝试注册第二个身份   完成注册用例;服务器也可以返回一个    如果未注册的实体也等待,则会出现流错误   在认证或尝试完成除以外的任务之前很久   成功完成注册使用后的身份验证   情况下。

连接构建器如下所示:

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 个答案:

答案 0 :(得分:3)

You have to separate connect().login() chain.

        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