Altenwald Blog
Blog sobre programación, software libre, redes, servidores, ...
Menú
Acerca de... ¿Quiénes somos? RSS
Categorías
sistemas (70) desarrollo (128) historias (25) productividad (49) seguridad (10) libros (25) noticias (45) opinión (35) humor (3)
Etiquetas
programación (111) desarrollo de software (79) erlang (75) opinión (37) noticia (36) libros (28) servidores (26) desarrollo web (24) base de datos (24) administración de sistemas (23) php (22) desarrollo ágil (22) empresa (21) otp (20) ruby (19) ingeniería de negocio (18) elixir (18) desarrollo profesional (16) redes (16) seguridad (14)
2016-09-11
6 min desarrollo
Haciendo Whatsapp (II): Servidor y Autenticación
[ desarrollo de software ]  [ whatsapp ]  [ xmpp ]  [ ejabberd ]  [ mongooseim ] 

Uno de los grandes problemas al hacer una aplicación de chat para el móvil es la poca fiabilidad de las redes móviles. XMPP no fue diseñado para este tipo de escenarios pero las últimas versiones de ejabberd y MongooseIM vienen a darnos la solución, ¿implementamos nuestro chat?

En sus últimas versiones, tanto ejabberd como MongooseIM se han enfocado a soluciones móviles. Han implementado especificaciones (XEPs) que aún están en fase experimental o incluso han optado por soluciones un poco más personalizadas. Todo por intentar llevar a los desarrolladores más facilidades. Veamos lo que nos aporta cada servidor.

ejabberd

Las versiones de ejabberd se suceden cada pocos meses. Las últimas noticias en su blog (my activo) hablan de las versiones 16.06 (de junio de 2016) y 16.08 (agosto de 2016). Tienen bastantes correcciones y nuevas características.

Los últimos avances para la implementación de chats pueden leerse en las entradas referentes a MUC/Sub y las notificaciones push (algo más antiguo).

Además, los últimos avances de ejabberd nos permiten agregar módulos al código base sin necesidad de recompilar la base, manteniendo el código original sin modificaciones y hacer estos nuevos módulos usando Erlang, Elixir, LFE o Lua.

MongooseIM

Algo más lento en su desarrollo (la versión 1.6.2 fue lanzada en febrero de 2015 y aún a día de hoy no se ha lanzado la última 2.0.0 que es la siguiente en la línea), MongooseIM está aún en proceso de lanzamiento de su versión 2.0.0 que estará orientada a los móbiles. Esta versión dispone de características ya disponibles en las versiones estables actuales como Stream Management o Archiving, pero agregan muchos más avances como MUC Light y el tan esperado PubSub.

No obstante aún no disponen de ningún mecanismo para las notificaciones push. Esto implica desarrollo para poder adaptar MongooseIM a nuestra solución.

Avanzamos con ejabberd

En cada periodo de tiempo he optado por una solución u otra. Hace dos años me habría decantado sin dudarlo por MongooseIM porque tenía muchas más características atractivas que ejabberd, pero desde ese tiempo hasta el día de hoy ejabberd ha impulsado su producto consiguiendo ponerse de nuevo a la cabeza en lo que a características se refiere. Quizás en base a estabilidad y rendimiento habría que hacer algunas pruebas para estar más seguros.

En cualquier caso, la elección de ejabberd nos proporciona la base necesaria para no tener que desarrollar mucho código propio.

Diseño de la aplicación

En este momento y teniendo un servidor con una instancia de ejabberd tal cual, podemos comenzar a desarrollar nuestra aplicación. Los detalles a tener en cuenta:

Hay muchas más características que pueden implementarse, como la subscripción a noticias de una web obteniendo la información tipo RSS/Atom de subscripción cada vez que haya algo nuevo, bloqueo de usuarios, envío de multidifusiones, etc.

En este artículo comentaré un poco acerca de la autenticación y continuaré con el resto de los elementos en siguientes artículos.

Autenticación

La autenticación es un elemento que se ha ido complicando con el tiempo. No solo a nivel de servidor de dónde y cómo realizar la salvaguarda de las credenciales para cada usuario, sino también en la parte del cliente decidiendo si emplear el típico par de usuario/clave o un sistema basado en OpenID o OAuth/OAuth2 para el alta e inicio de sesión del usuario.

Para el primer problema, dónde y cómo guardarlo, ejabberd dispone de varios backends de base de datos e incluso otro conjunto de módulos que nos permite no solo preguntar a otros tipos de base de datos diferentes, sino también a otros sistemas vía HTTP, por ejemplo. Aquí un listado de las posibilidades:

El segundo problema es cómo realizar la autenticación. De la forma tradicional (usando el par usuario/clave) no tenemos el menor problema y podemos avanzar rápido con las funciones estándar de la librería que hayamos elegido para implementar el cliente.

Si finalmente optamos por emplear otro tipo de implementaciones, aquí dejo un pequeño listado de qué tipo de implementaciones y qué habría que tener en cuenta:

Por último comentar que si no encontramos el módulo que mejor se adapte a nuestras necesidades, siempre podemos copiar el que más se parezca y modificarlo para encajar en lo que buscamos.

Conclusiones

Tenemos servidor y tenemos guía para realizar nuestra autenticación. Nos va quedando menos para implementar nuestro sistema de chat con éxito. Nadie dijo que se puediese realizar en un solo día, pero con la guía adecuada y teniendo claras nuestras necesidades podemos conseguirlo en muy poco tiempo.

¿Has encontrado fácil el comienzo y tienes la autenticación funcionando?, ¿te has lanzado a crear tu propia autenticación en algún lenguaje de la lista soportada por ejabberd?, ¿necesitas ayuda porque algo no consigues solucionarlo? ¡Comenta y te ayudamos!

Autor
Manuel Rubio
Programación Concurrente & Erlanger