6 points par GN⁺ 2025-08-16 | 1 commentaires | Partager sur WhatsApp
  • Pour résoudre la lenteur et la complexité du processus d’entrée de l’application PureGym, l’auteur l’a personnellement optimisé avec Apple Wallet
  • Le code QR existant impose d’ouvrir l’application et de charger les informations à chaque fois, un mode d’accès inefficace qui prend environ 47 secondes
  • Grâce à diverses techniques de reverse engineering, à l’usage de mitmproxy et au framework PassKit, l’auteur a mis en place un pass Wallet à renouvellement automatique
  • Au cours de ce processus, il a constaté le fonctionnement interne de PureGym exposé sur le web, notamment une faille de sécurité du code PIN, la structure d’authentification de l’API et les données de localisation des clubs
  • Au final, il a créé une expérience permettant d’entrer en 3 secondes, tout en précisant clairement qu’il s’agit d’une expérimentation personnelle et non d’un service officiel

47 secondes : le début de la frustration

  • Un jour de semaine à 11 h 15, il a fallu 47 secondes pour ouvrir l’application devant l’entrée de PureGym
  • Le signal est faible, il faut passer la connexion Wi‑Fi, le lancement de l’application, diverses notifications push et des offres promotionnelles avant que le code QR n’apparaisse
  • Le code QR met longtemps à s’afficher, au point de se sentir observé par les autres membres
  • Répétée 6 fois par semaine, cette expérience inefficace fait perdre 282 secondes chaque semaine
  • Comparée à l’expérience sans friction d’Amazon Fresh, l’UX d’entrée de PureGym est très en retard

Le mystère d’un PIN vieux de 8 ans

  • L’auteur utilise le même code PIN à 8 chiffres depuis 8 ans
  • Ce PIN n’expire pas et n’a jamais changé
  • À l’inverse, le code QR dans l’application est remplacé par une nouvelle valeur chaque minute
  • Il existe donc une contradiction majeure entre le niveau réel de sécurité et son implémentation effective
  • La méthode par PIN dure de manière excessivement longue alors que seul le code QR est strictement protégé : une véritable « mise en scène de la sécurité »

Comprendre PureGym avec mitmproxy

  • Au départ, l’auteur a essayé d’utiliser dans Apple Wallet une capture d’écran du code QR, mais cela n’a évidemment pas fonctionné
  • Le code QR de PureGym est généré dynamiquement, expire au bout d’environ une semaine, mais l’application le renouvelle toutes les minutes
  • En recherchant des dépôts liés à « PureGym » sur GitHub, l’auteur a découvert la structure d’authentification de l’API
    • Le PIN à 8 chiffres utilisé pour la connexion sert aussi de mot de passe API
    • Les informations d’authentification basiques encodées en Base64 offrent elles aussi une sécurité limitée
  • Pour analyser le trafic de l’application, il a intercepté les requêtes avec des outils proxy comme mitmproxy
    • La structure JSON du code QR se compose de part1 (id fixe), part2 (horodatage), part3 (salt de renouvellement)
    • L’API indique même le moment du renouvellement et les conditions d’expiration

PassKit : le potentiel d’Apple Wallet

  • Un pass Apple Wallet n’est pas une simple carte statique, mais une sorte de mini‑application capable de se mettre à jour, d’envoyer des notifications push et de réagir à la localisation
  • L’implémentation de PassKit nécessite une spécification JSON, des ressources d’image, une signature par certificat et un service web pour les mises à jour en temps réel
  • Le portail développeur d’Apple exige l’émission d’un Pass Type ID et d’un certificat WWDR
  • La signature et la gestion des certificats sont complexes, mais une fois réussies, l’expérience sur un appareil réel devient fluide

Mise en place d’un backend Swift

  • Même s’il utilise habituellement Node.js, l’auteur a directement implémenté le service web PassKit avec Vapor en Swift
    • Lorsqu’un pass doit être mis à jour, une notification push silencieuse déclenche la mise à jour automatique
    • Cela permet un renouvellement du pass naturel et invisible pour l’utilisateur

Automatisation des emplacements PureGym dans tout le pays

  • Les pass Apple Wallet peuvent s’afficher automatiquement à un emplacement donné
  • Le site officiel de PureGym ne fournit pas les coordonnées détaillées, mais l’API donne accès à la liste des coordonnées de tous les clubs du pays
  • En analysant toutes les coordonnées des clubs, l’auteur attribue à chaque pass le club le plus proche
  • Inconvénient : si un PureGym se trouve dans un centre commercial, le pass peut apparaître même lors d’une simple visite shopping

Intégration avec l’Apple Watch

  • Le pass Apple Wallet se synchronise automatiquement sur l’Apple Watch sans manipulation supplémentaire
  • Deux clics au poignet, scan, puis entrée : le tout prend 3 secondes, soit un gain spectaculaire
  • Cela représente plus de 93 % de temps économisé

Le changement en chiffres

  • Temps d’entrée avec l’application PureGym d’origine : 47 secondes
  • Temps d’entrée avec le pass Apple Wallet : 3 secondes
  • Temps moyen économisé par semaine : 4,4 minutes (3,8 heures par an)
  • Des membres autour de lui lui ont demandé 23 fois « il existe une appli pour ça ? », et il a expliqué à chaque fois qu’il s’agissait d’une solution non officielle
  • Malgré les demandes, aucune diffusion n’est prévue pour des raisons de droits et de politique de service

Bonus : intégration avec Home Assistant

  • Grâce au endpoint du nombre de personnes présentes de l’API PureGym, il affiche le niveau d’affluence actuel de la salle sur un tableau de bord IoT
  • Ces données permettent de décider de revenir aux heures plus calmes, avec à la clé un meilleur rendement et une motivation accrue

Réalité de l’ingénierie et éthique

  • À l’origine, il s’agissait simplement de résoudre une gêne personnelle, mais c’est aussi un domaine que PureGym n’a pas amélioré depuis des années
  • Un prototype créé hors de l’organisation peut parfois résoudre un problème plus vite qu’une feuille de route officielle
  • Officiellement, cela peut constituer une violation des conditions d’utilisation, et PureGym pourrait le bloquer à tout moment
  • Il n’y a jamais eu d’automatisation ni de partage : uniquement une expérimentation personnelle, avec respect de principes comme le cache pour préserver la stabilité

Suite et conclusion

  • À l’avenir, des idées d’extension comme une « notification push de honte » pourraient être envisagées
  • L’utilité concrète est modeste, mais l’auteur se dit satisfait d’avoir optimisé 3,8 heures par an de « gestes inutiles »
  • Si PureGym mettait en place une implémentation officielle, davantage d’utilisateurs pourraient en bénéficier
  • Cela reste un exemple marquant d’une « expérience non officielle mais efficace »

1 commentaires

 
GN⁺ 2025-08-16
Commentaires sur Hacker News
  • Je trouve que c’est un article vraiment amusant et inspirant, qui capture bien l’essence du métier d’ingénieur, et montre que l’OP est un vrai hacker
    Quand j’ai passé trois mois aux États-Unis, je me suis inscrit chez PureGym et j’ai reçu un PIN, puis j’ai annulé mon abonnement plus tard. Ensuite, Chrome m’a signalé que mon PIN PureGym avait fuité
    Deux ans plus tard, je suis retourné aux États-Unis et j’ai reçu le même PIN, ce qui me semble être un énorme problème de sécurité
    L’app PureGym et son token étaient aussi intéressants, et j’ai également découvert une faille de sécurité dans le système d’activation des fauteuils de hydromassage, qui acceptait n’importe quel PIN
    • Le signalement de fuite du PIN PureGym par Chrome semble probablement être un faux positif, ce genre de chose peut arriver quand Chrome utilise l’API HaveIBeenPwned
      Par exemple, un PIN comme 87623103 est transformé en hash 558B4C37F6E3FF9A5E1115C66CEF0703E3F2ADEE, et si on le cherche dans la plage de hash HaveIBeenPwned, on voit qu’il a effectivement fuité plusieurs fois
  • C’est le genre de sujet auquel il faut réfléchir rien qu’une fois : un clavier physique laissé dehors au Royaume-Uni, couvert de météo britannique, de shakes protéinés et de regrets, potentiellement filmé en direct sur TikTok via la Ring Doorbell de quelqu’un… et malgré tout, il accepte encore sans problème mon ancien PIN. En revanche, un QR code numérique aurait besoin d’une rotation cryptographique digne de la NSA
  • J’adore lire ce genre d’histoire. Au lieu d’attendre que l’app fonctionne correctement, j’ai simplement mémorisé le PIN. Du coup, je peux entrer encore plus vite qu’avec la solution proposée par l’OP, et c’est plus simple car ça ne demande ni appareil ni service supplémentaire
  • Quand j’ai lu que « s’il n’y a pas d’implémentation Apple Wallet, ce n’est pas sans raison », en regardant les captures d’écran de l’app PureGym, on dirait franchement juste un habillage léger autour d’un site web mobile, ou quelque chose fait avec Flutter. La probabilité qu’ils aient en interne un développeur capable de gérer toutes les subtilités des API Apple me paraît très faible
    • C’est exactement ça. Le vrai métier de PureGym, c’est de faire entrer le plus d’abonnés possible et de rendre la résiliation difficile, pas de faire du développement. Dans le meilleur des cas, ils ont un développeur web en interne qui arrive tout juste à maintenir le site et la base de données, et ils sous-traitent le reste en demandant « faites en sorte que ça ressemble à une app ». Dans le pire des cas, tout le web est externalisé et il faut payer un supplément même pour changer une lettre dans un titre
    • Cela dit, on peut se demander pourquoi ils n’apprennent pas. Il y a Google, Stack Overflow, des LLM et plein d’outils, et pourtant rien ne s’améliore. Je pense que c’est soit parce que personne ne se soucie de l’UX, soit parce que l’équipe backend est partie depuis longtemps et que tout est maintenu au strict minimum par un effectif réduit d’ingénieurs peu coûteux
    • S’ils ajoutent Apple Wallet, il faut aussi supporter Android Wallet, donc ça augmente encore le code à maintenir. Cela dit, ils pourraient au moins faire en sorte que le QR code s’affiche systématiquement dès l’ouverture de l’app
    • J’ai aussi l’app PureGym sur mon téléphone, et oui, elle donne vraiment l’impression de n’être qu’un emballage autour du site web PureGym
  • C’est une remarque en or massif : le PIN à 8 chiffres de la porte de la salle sert aussi de mot de passe API, et la majorité des utilisateurs ne l’ont même pas choisi eux-mêmes. J’espère au moins qu’il y a du rate limiting sur les tentatives échouées. On dirait que connaître une adresse e-mail suffit pour obtenir un accès API immédiat. Je me demande aussi si le périmètre des permissions qu’on peut demander est bien limité
    • OP ici
      Oui, on obtient bien un accès API immédiat. En pratique, je n’ai jamais rencontré de rate limit en utilisant l’app et le site, et les tentatives ratées semblent assez généreusement tolérées
      Le scope présenté dans le post est le même que celui utilisé par l’app officielle et par les clients non officiels sur GitHub
      La probabilité qu’il existe des scopes supplémentaires me semble très faible. Voir aussi PureGym PHP Wrapper et PureGym Attendance Python
  • J’ai souvent eu ce type de discussions sur la roadmap d’une app PureGym dans l’industrie IT
    Du style : « si on construit cette fonctionnalité, alors on devra l’assumer nous-mêmes »
    Et la blague qui revient souvent : « très juste, mettons-la sur la roadmap 2028 »
    • C’est pareil dans les réunions de mon service. Quand on parle de roadmap et de planification, la vraie question est toujours : « est-ce que ça aide notre chiffre d’affaires, ou est-ce que ça coûte de l’argent ? »
      La liste des tâches prévues et la wishlist sont déjà longues, donc il est très difficile d’ajouter des fonctionnalités
      La meilleure chose que PureGym pourrait faire maintenant, ce serait de donner quelques milliers de livres sterling et un accès gratuit à vie au développeur qui a créé cette app
  • Je me demande combien coûte le certificat Pass Type ID délivré par l’Apple Developer Portal
    J’aimerais créer un pass Apple Wallet, mais la configuration du compte développeur et les coûts supplémentaires me freinent
    • À ma connaissance, c’est inclus dans l’abonnement développeur standard, mais il faut continuer à le renouveler chaque année pour le conserver
  • Si on reçoit une notification push chaque minute pour obtenir un nouveau code, est-ce que ça ne pose pas un problème de batterie ?
    • D’après l’article, le code est renouvelé une fois par semaine, donc on peut supposer qu’une fois par semaine est le maximum
    • Les notifications push ont un mode d’exécution en arrière-plan, donc elles ne sont traitées que lorsque le téléphone est prêt
      En cas de batterie faible ou de mode économie d’énergie, elles peuvent même ne pas être livrées du tout, précisément pour minimiser la consommation
      Les notifications plus importantes, elles, doivent impérativement afficher un élément d’interface et arrivent quelle que soit la situation énergétique
  • J’ai pris beaucoup de plaisir à lire ce texte, amusant et plein de détails techniques