Notificaciones - TeamSecurityFirst/GeoGuardianWiki GitHub Wiki
En esta entrada de la Wiki se explica cómo funciona el flujo de envío de notificaciones por cada uno de los tres medios disponibles en GeoGuardian: correo electrónico, Telegram Messenger y SMS. Para cada uno, se explica en qué consiste la activación (si fuera necesario) y el envío de notificaciones en sí mismo.
Correo electrónico
Para el envío de correos electrónicos utilizaremos el servicio de SMTP de Google, Django dispone de un wrapper (django.core.mail) que simplifica el envío de correos. Todas las notificaciones se enviarán utilizando un correo de Google que hemos creados para la app ([email protected]).
Activación
No es necesario verificar el correo electrónico de nuestros usuarios pues ya se han logeado con una cuenta de Google a la cual enviaremos las notificaciones. En el caso de los usuarios anónimos, al no disponer de correo, no podrán recibir este tipo de notificaciones.
Envío
En el momento que hubiera que enviar una notificación, nuestro servidor se encargará de enviar los correos al servidor SMTP de Google y este los enviará a los correspondientes destinatarios.
Telegram
Se ha creado un bot de telegram (@GeoGuardianBot), que usaremos tanto en la activación como en el envío de nuestras notificaciones. También se ha configurado un webhook, es decir, una endpoint de nuestro servidor a la que el bot enviará los mensajes que reciba.
Activación
Para poder enviar un mensaje por Telegram a nuestro usuarios, es necesario disponer de un chat_id (identificador único que Telegram asigna a cada conversación). Para obtener este chat_id es necesario que el usuario inicie una conversación con nuestro bot, afortunadamente, esto es un proceso automatizable que hemos implementado de la siguiente manera:
- El cliente notifica que quiere vincular su cuenta de Telegram.
- El servidor recibe la petición y genera un token temporal para identificar al cliente.
- El servidor envía al cliente el token.
- El cliente inicia una conversación con el bot, pasándole el token.
- Telegram "redirige" el mensaje a nuestro server (previamente se ha configurado un webhook que escucha las peticiones entrantes de Telegram)
- El servidor recibe el token y el chat_id y confirma que el token sea válido. Le asigna el chat_id al usuario (se envía un Telegram de bienvenida).
- Se guarda en Firebase el chat_id del usuario.
- El cliente, al ver que tiene un chat_id ya puede activar/desactivar sus notificaciones cuando quiera.
Envío
Una vez configurado el chat_id, el envío es muy simple, únicamente es necesario hacer una petición HTTP al bot de Telegram con el chat_id del usuario seguidor y este se encargará de que reciba el mensaje.
SMS
Para el envío de SMS vamos a utilizar la API de Twilio. Twilio, ofrece una capa gratuita que nos sirve para enviar SMS. Sin embargo, existe una limitación de la capa de prueba: es necesario añadir los números de teléfono de destino a mano en la consola de Twilio si queremos enviarles un SMS. Para la realización de esta práctica hemos introducido nuestros números de teléfono para probar las notificaciones, pero, para utilizar Twilio en producción, sería necesario pasar a un plan de pago. Por lo tanto, tras comprobar que Twilio funcionaba correctamente, hemos decidido introducir la cantidad mínima para pasar al plan de pago y evitar así dicha limitación.
Activación
La activación de las notificaciones por SMS se podría llevar a cabo de manera simple permitiendo al usuario indicar un número de teléfono y a continuación comenzar a enviar los SMS a ese número. A pesar de ello, hemos considerado necesario hacer una capa de verificación a mayores, comprobando que realmente el número que ha introducido es el correcto. Para esto, una vez es introducido el número de teléfono, al volver a clickar en activación por SMS, la aplicación pedirá al usuario que valide el código que se ha enviado por SMS al número en cuestión. De esta manera, nos aseguramos que el dispositivo sea realmente propiedad del usuario, y así evitar cualquier tipo de problemas.
Para ello, utilizaremos la API de Google Play Services, SMS Retriever API que nos permite automatizar este proceso. Aunque permitiremos también al usuario hacerlo de manera manual, si así lo prefiriese (por ejemplo, si utiliza la app en una tablet y quiere introducir el número de su teléfono móvil) o si no se puediera recuperar el SMS de manera automática.
- El cliente quiere activar las notificaciones, por lo que envía al servidor su número de teléfono
- El servidor genera un token y se lo asigna a ese usuario
- Se envía el token al usuario mediante Twilio
- El usuario recibe un SMS con el token (y el hash de la firma de nuestra app)
- La API reconoce nuestro SMS y obtiene el token (este paso también lo podría ejecutar el usuario introduciendo el código manualmente)
- El cliente envía el token al servidor
- El server verifica que el token y el usuario coincidan.
- Se guarda el número de teléfono en Firebase.
- El usuario ya puede activar y desactivar las notificaciones ya que dispone de un número de teléfono validado.
Envío
El envío es análogo a los dos medios de notificación anteriores.