One Club · Publicis Groupe
Le club de sport des collaborateurs de Publicis, gamifié
- App iOS et Android
- Site web
- Back-office web

La version web

Rôle
Développeur web et mobile, en alternance
Un écosystème web et mobile pour fédérer les collaborateurs autour d'objectifs sportifs : les activités remontent depuis Strava ou Garmin, un moteur de gamification les transforme en points, paliers et classements, et un fil social fait vivre le club. Connexion par le compte Microsoft de l'entreprise. Présenté comme preuve de concept.
Ce qu'il y a dedans
- Application web React et TypeScript, application mobile Flutter iOS et Android.
- Backend NestJS, MongoDB Atlas hébergée à Paris, synchronisation horaire des activités.
- Connexion Microsoft Entra ID en OpenID Connect avec PKCE, sans secret côté client.
- Strava et Garmin en OAuth2 avec webhooks, connexions facultatives et soumises au consentement.
- Gamification : points, paliers, classements individuels et par équipe, récompenses collectives.
- Fil social, événements collectifs et sorties proposées entre collègues.
- Back-office protégé par JWT et second facteur, limitation de débit, validation des entrées.
En détail
01Le produit
Une plateforme de gamification sportive interne à Publicis France, baptisée One Club. Un collaborateur relie son compte Strava ou Garmin, ses activités remontent automatiquement, sont converties en points et alimentent des classements individuels et par équipe autour d'événements. Autour vivent un fil social et des sorties organisées entre collègues.
Le principe directeur : le collectif est le sujet. Les points individuels font avancer des jauges d'équipe et de club, dont les paliers débloquent des récompenses pour tout le monde.
Trois surfaces : une application mobile Flutter pour iOS et Android, un site web React, et un back-office d'administration réservé au web.
02Identité et connexion
L'entrée est Microsoft Entra ID, en OpenID Connect avec PKCE : le collaborateur s'authentifie chez Microsoft avec les politiques du tenant, MFA comprise, et l'application ne voit jamais son mot de passe. Le backend récupère les clés publiques du tenant, vérifie signature, émetteur, destinataire, expiration et tenant, puis émet son propre jeton de session de 8 heures. Aucun jeton Microsoft n'est conservé.
Le back-office a son propre chemin : mot de passe haché en bcrypt, puis un code à six chiffres envoyé par e-mail, tiré aléatoirement, valable dix minutes, à usage unique, comparé en temps constant. La création d'un administrateur se fait par une commande serveur, jamais par une route exposée.
Le SSO attend encore les Client ID Azure de l'IT : en attendant, un lien « Continuer avec Strava » reste disponible et disparaît de lui-même dès que le Client ID est configuré.
03Activités, points, événements
Strava et Garmin se relient indépendamment, chacun révocable, avec une fenêtre de consentement qui annonce ce qui sera lu, la finalité et la lecture seule, comme le recommande la CNIL. Les jetons sont stockés par utilisateur et renouvelés automatiquement ; les secrets des fournisseurs restent côté serveur.
La synchronisation passe par une tâche horaire et par les webhooks des deux fournisseurs. Sur webhook, le serveur rappelle l'API plutôt que de faire confiance à la charge utile. Chaque activité est dédupliquée sur l'identifiant du fournisseur, donc une synchronisation répétée ne double jamais les points.
Une règle de points par sport, modifiable par les administrateurs : 100 points par kilomètre couru, 40 à vélo, 400 en natation, 50 en marche, et du temps pour la randonnée, la musculation, le yoga et le crossfit. Les activités Garmin sont traduites vers le vocabulaire Strava pour qu'un seul jeu de règles couvre les deux. Badges automatiques sur la distance annuelle et le total de points.
Deux natures d'événements. Les officiels, créés depuis le back-office, avec période, sports acceptés, objectif global et trois familles de récompenses à paliers, en équipes si on l'active. Les personnels, que n'importe qui crée depuis l'onglet Événements, ne rapportent aucun point : le serveur le force quoi que le client envoie, ce qui écarte la triche et évite de modérer.
04Architecture et sécurité
Mobile en Flutter avec Riverpod, go_router et Dio ; web en React 19, Vite et TypeScript sur Vercel ; API NestJS 10 sur Render à Francfort ; MongoDB Atlas à Paris. Aucun flux entrant vers le système d'information de Publicis, le seul contact est l'authentification sortante vers Entra ID.
HTTPS partout, sessions JWT vérifiées à chaque appel, CORS sur liste blanche, limitation de débit à 120 requêtes par minute et 5 sur l'authentification, en-têtes Helmet, validation stricte des entrées qui ferme l'injection NoSQL, secrets mobiles dans le Keychain iOS et le Keystore Android. Un compte bloqué perd l'accès en moins de trente secondes, sans attendre l'expiration de sa session.
C'est une preuve de concept, présentée comme telle : hébergeurs gratuits pour la phase de démonstration, cible Azure en France sur la souscription du groupe, et quelques écrans encore inachevés, comme le chat d'équipe, le parrainage et l'intégration Steam.