Les étapes essentielles lorsque vous publiez une application Slack en utilisant l’API de Google

le 08/02/2019 par William Ong
Tags: Software Engineering

Aujourd’hui, de nombreuses entreprises ou équipes utilisent Slack pour communiquer et partager du contenu. Slack est une plateforme très flexible et ouvre des possibilités aux développeurs, car il fournit des webhooks (entrants, sortants), des bots, et la possibilité d’interagir avec les événements. Votre Slack reflète votre façon de travailler.

Chez OCTO Australie, nous customisons pas mal notre Slack pour faciliter la gestion de notre bureau (par exemple pour vérifier si quelqu'un est au bureau, ouvrir la porte du bâtiment...) ou pour créer des outils et des notifications fun connectées à des produits IoT faits maison (arrose les plantes, la “roue de l’infortune” une vraie roue de foire qui tourne quand on l’appelle depuis Slack et qui désigne un(e) infortuné(e) pour une tâche).

Récemment nous avons decidé de créer notre propre bot pour enregistrer les photos que nous partageons dans Slack directement dans notre Google Drive: c’est déjà cool de partager les photos de la Christmas Party entre nous, mais encore plus de les sauver automatiquement dans le répertoire idoine.

Et nous avons aussi pensé que ça serait génial si nous pouvions le partager à toute la communauté Slack dans l'app store Slack ! Il s’agit de PhotoStash.

Voici l'architecture générale de notre application :

Nous avons construit notre bot en Golang en utilisant le framework Serverless pour avoir rapidement notre produit en ligne. Serverless nous aide à configurer facilement notre infrastructure AWS et à la déployer.

Ensuite, pour adapter notre produit vers une application Slack publique, un certain nombre d'étapes doivent être suivies :

  • Configurez votre application Slack et respectez la politique Slack.
  • Configurer votre application Google Drive à travers la console Google
  • Sauvegarde des tokens de Slack et Gdrive

Commencer par configurer Slack

Vous pouvez facilement créer une application avec Slack via leur interface (https://api.slack.com/apps) et elle doit être gérée par votre équipe Slack.

Un point important est de créer une deuxième application, une pour la prod et une autre le développement parce qu'il n'y a aucun moyen pour le moment d'utiliser la même application et se connecter à 2 environnements différents, même si, Slack vous fournit  2 ensembles de clés (pour la dev et la prod).

Vous devez sélectionner avec soin les permissions dont vous avez besoin pour que votre application accède aux éléments de l’espace de travail Slack de vos utilisateurs. Ces permissions sont données par un token (protocole OAuth2). Vous ne pouvez demander que les scopes que votre application utilise (politique de sécurité de Slack). Si vous ajoutez une nouvelle permission, les utilisateurs devront réinstaller votre application.

Comme Slack utilise OAuth2 pour générer des tokens, vous devez déclarer vos URL de redirection, qui est l’url de votre serveur recevant le code pour pouvoir le traiter. Vous pouvez en ajouter autant que vous le souhaitez et cela fonctionne aussi bien avec votre serveur local.

Selon les fonctionnalités de Slack que vous avez sélectionnées, vous devez ajouter des paramètres, par exemple dans notre cas, nous demandons un abonnement à un événement et nous devons donc définir une URL (vers le serveur) pour que Slack l'appelle quand l’événement spécifique survient.

Une fois cela fait, vous pouvez générer votre bouton Slack pour l'utiliser pour l'installation via un site Web ou directement dans l’app store Slack.

Pour un nouveau produit, vous devez également avoir une page de présentation et nous utilisons le service AWS S3 statique pour stocker notre contenu. La dernière étape concernant Slack est de se conformer aux politiques sur l'utilisation des données des utilisateurs, le droit à l’image, le support pour les utilisateurs, et ainsi de suite, il y a une longue checklist mais rien de difficile à suivre (https://api.slack.com/docs/slack-apps-checklist).

Slack met à votre disposition de nombreux tutoriels pour vous aider à créer votre application et de plus, leurs équipes sont très réactives pour donner leur feedback après soumission.

Google Drive

Pour la partie suivante, nous devons utiliser l'API de Google Drive et pour cela, nous devons configurer Google OAuth.

Parce que notre application nécessite une communication serveur à serveur et une autorisation (nous transférons sur Google Drive au nom des utilisateurs), il est nécessaire d'obtenir un token, qui est un justificatif que nous pouvons utiliser pour effectuer des tâches prédéfinies (téléchargement).

Dans la console Google Cloud, sous “APIs and Services”, “Credentials”, nous pouvons créer des identifications OAuth et les télécharger dont nous aurons besoin lorsque nous ferons une demande à l'API pour nos clients. Afin de mettre en place ce service, nous devons également fournir un certain nombre de choses, y compris les domaines autorisés (par exemple photostashbot.com) et avant de le lancer, il doit être approuvé.

Application

L'essentiel est d'envoyer une requête à l'API avec nos identifiants d'application, à partir d'un domaine enregistré et avec une URL de redirection préconfigurée qui recevra le token.

Une fois le token accordé, il peut être stocké dans DynamoDB, avec un “Refresh Token”. Ceci est nécessaire pour générer de nouveaux tokens à partir de Google. Chaque token d'accès a une durée de vie limitée, ce qui signifie qu’on doit changer de token pour accéder au compte. Ceci est différent de l'API Slack qui n'utilise pas de “refresh tokens”.

Une partie de la documentation pour utiliser Google Drive était également difficile à trouver. Par exemple, si un utilisateur désinstalle l'application de Slack, nous voulons également supprimer les identifiants de notre base de données pour Slack et Google, mais dans le cas de Google, nous devons également supprimer l'accès des applications au compte Google des utilisateurs en retirant le token. Pour cela, il faut faire un appel API à https://accounts.google.com/o/oauth2/revoke?token= mais la documentation le précisant était difficile à trouver.

Environnements (local/dev/production)

Travailler avec une architecture serverless rend la configuration des environnements un peu plus difficile. Bien que le framework Serverless facilite le déploiement de l'infrastructure vers AWS, il y a du challenge lorsqu'on travaille avec un environnement local et de développement.

Afin de tester localement, nous utilisons SAM car c’est seul moyen de faire tourner notre application en Golang et spécifions la configuration dans un fichier yml. Mais cela à ses limites parce que dans certains cas, l’application nécessite d’être en ligne pour pouvoir interagir avec l'API de Slack. Par exemple, il n'est pas possible de tester le flux OAuth (s'identifier avec Slack, ajouter à Slack) localement. Dans ce cas, nous devons déployer la version locale vers AWS.

Le souci, c'est que si vous déployez sur dev, vous écrasez la version de développement (qui est gérée par le CI/CD), et dans de nombreux cas, il est nécessaire de deployer pour tester. Cela ajoute donc de la complexité à mesure que les membres de l'équipe travaillent sur le projet de manière synchrone.

L'usine de développement est facilité par CircleCI. La configuration des différents URLs, des  bases de données est stockée dans un ensemble de fichiers, tandis que tous les secrets sensibles pour accéder à Slack ou Google sont accessibles via des variables d'environnement fournies par CircleCI pendant le processus de création et de déploiement.

Conclusion

La partie la plus complexe du développement consistait à récupérer les identifiants Slack et Gdrive pour les sauvegarder, les sécuriser et surtout comment les gérer et les utiliser en particulier pour Google Drive.

Lorsque vous créez une application publique, il y a beaucoup de choses dont vous devez faire attention, comme le RGPD sur l’utilisation des données personnelles, l'usage légal sur les droits d’images, les conditions d'utilisation, etc.

C'était amusant de pouvoir développer un petit projet qui pourrait être utile aux autres.

Vous souhaitez jeter un coup d’oeil ? Voici notre application Slack : https://photostashbot.com/