Smack 4.1 Registro anónimo de Android para Openfire
tcp xmpp (1)
Deseo conectarme de forma anónima al servidor de Openfire con el cliente Android Smack 4.1 y registrar el nuevo usuario (username = "wq", password = "wq") con AccountManager, y luego desconectarme e iniciar sesión como usuario registrado no anónimo.
3.1.1 Registro con un servidor
Se debe tener especial cuidado cuando una entidad no registrada interactúa con un servidor en lugar de un servicio. Normalmente, un servidor permite el registro en banda para que las entidades puedan "iniciar" su participación en la red Jabber; este bootstrapping ocurre cuando una entidad no registrada y no autenticada abre una conexión TCP a un servidor e inmediatamente completa el caso de uso de registro con el servidor, luego se autentica usando la identidad recién registrada. Como se indicó, cuando un servidor recibe un IQ-get para la información de registro, DEBE suponer que la entidad solicitante no está registrada a menos que la entidad ya se haya autenticado. Dependiendo del aprovisionamiento del servicio local, un servidor PUEDE devolver un error de estrofa si una entidad no registrada intenta registrarse demasiadas veces antes de autenticarse o si una entidad intenta registrar una segunda identidad después de completar con éxito el caso de uso de registro; un servidor PUEDE también devolver un error de transmisión si la entidad no registrada espera demasiado tiempo antes de la autenticación o intenta completar una tarea distinta de la autenticación después de completar con éxito el caso de uso de registro.
constructor de conexión se ve así:
xmpptcpConnection = new XMPPTCPConnection(XMPPTCPConnectionConfiguration.builder()
.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
.setResource(resource)
.setHost(localhost)
.setServiceName(serviceName)
.setPort(port)
.setDebuggerEnabled(true)
.setSendPresence(true)
.build()
);
Y registro:
if (password != null && username != null) {
AccountManager accountManager = AccountManager.getInstance(xmpptcpConnection);
accountManager.sensitiveOperationOverInsecureConnection(true);
accountManager.createAccount(username, password);
}
else {
smackError("Username or password wrong");
}
Pero recibí un error de solicitud incorrecta
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>[email protected]/cafb2f97</jid></bind></iq>
05-21 21:34:20.843 19535-19564/com.xmpp D/SMACK﹕ User logged (0): [email protected]: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="[email protected]/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="[email protected]/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)
No recibo errores si estoy conectado con una cuenta no anónima, solo se agregó un generador de conexión:
.setUsernameAndPassword(username, password)
pero no quiero usar otra cuenta ya registrada para registrar un nuevo usuario en el servidor. ¿Hay alguna buena solución para pasarlo de esta manera?
Debe separar la cadena 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