← Articles

Site d’inscription de la Purple Rouen

· 4 min de lecture · mis à jour le

Web · Sécurité · Go

La Purple Rouen est une course caritative organisée par des étudiants rouennais. J’en ai été le responsable technique de 2024 à 2026 : j’ai développé son site d’inscription et je l’ai fait tourner jusqu’au jour de la course. Sur ces deux éditions, 745 coureurs se sont inscrits et 7 073 € ont été reversés.

Le site est en deux morceaux. Le front-end, en Nuxt, est servi par Cloudflare Workers. Le back-end, en Symfony, porte les inscriptions, les paiements et les billets, avec un petit outil en Go pour les attestations médicales.

Le parcours d’un coureur

  1. Le coureur remplit le formulaire d’inscription et dépose son attestation Parcours Prévention Santé (PPS), vérifiée sur-le-champ.
  2. Il paie sur HelloAsso.
  3. Une fois le paiement confirmé, il télécharge son billet en PDF, avec un QR code, et reçoit sa confirmation.
  4. Le jour de la course, un bénévole scanne le QR code et lui remet son dossard, et son t-shirt s’il en a commandé un.

Le paiement avec HelloAsso

La Purple Rouen encaisse les inscriptions par HelloAsso, la plateforme de paiement des associations. Quand le coureur valide son inscription, le serveur appelle l’API checkout de HelloAsso, qui renvoie l’adresse d’une page de paiement, et le coureur y est redirigé.

Le retour du coureur sur le site ne prouve pas qu’il a payé : il suffit de connaître l’adresse de retour. Ce qui fait foi, c’est le webhook que HelloAsso envoie au serveur quand le paiement est terminé. C’est seulement à sa réception que l’inscription est confirmée et que le billet est généré. En attendant, la page sur laquelle revient le coureur interroge régulièrement le serveur, et affiche le billet à télécharger dès qu’il est prêt.

Vérifier les attestations PPS sans les lire une par une

Pour courir sans licence, il faut une attestation PPS délivrée par la Fédération française d’athlétisme. Vérifier ces attestations à la main, une par une, aurait été long et fastidieux pour les organisateurs. J’ai donc écrit un petit outil en Go qui s’en charge au moment où le coureur s’inscrit.

Ce que contient le QR code de l’attestation

Chaque attestation PPS porte un QR code. Il contient un lien vers une page de la FFA qui ressemble à ceci :

https://pps.athle.fr/passes/pps_vla[...]pzyq/verify?data=eJxFzE0KwjAQ[...]dJGXraF1xu6nS1T

Cette page affiche le numéro PPS, le nom, la date de naissance, le sexe et la date de fin de validité.

L’adresse contient aussi un paramètre data : un JWT encodé en base64 qui reprend exactement les mêmes informations. On pourrait être tenté de le décoder directement, sans rien demander à la FFA. Le problème, c’est qu’on n’a pas la clé qui a servi à le signer, donc aucun moyen de vérifier qu’il est authentique. Quelqu’un qui fabrique son propre jeton avec de fausses informations passerait sans difficulté.

Demander à la FFA plutôt qu’au QR code

La seule information fiable, c’est ce qu’affiche la page de la FFA. L’outil fait donc ce qu’un humain ferait : il ouvre le lien et lit la page. Une requête GET avec net/http, puis goquery pour extraire les champs du HTML :

// extract data from the definition list (dl > div > dt/dd)
var pps Attestation
doc.Find("dl > div").Each(func(i int, s *goquery.Selection) {
    title := strings.TrimSpace(s.Find("dt").Text())
    value := strings.TrimSpace(s.Find("dd").Text())

    switch title {
    case "Numéro PPS":
        pps.Number = value
    case "Nom":
        pps.Name = value
    case "Date de naissance":
        pps.BirthDate = value
    case "Sexe":
        pps.Sex = value
    case "Valable jusqu'au":
        pps.ValidUntil = value
    }
})

Au passage, les informations lues servent à pré-remplir le formulaire d’inscription : le coureur n’a plus à les retaper.

L’outil a vérifié plus de 1 500 attestations sur les éditions 2025 et 2026. Chaque dossier était validé au moment de l’inscription, sans contrôle a posteriori ni ressaisie : côté organisation, la vérification des certificats a tout simplement disparu de la liste des tâches. Le prix à payer, c’est que l’outil dépend du HTML de la FFA et qu’il faudra l’adapter si la page change. C’est raisonnable pour ne pas accepter des attestations falsifiées.

Le jour de la course

Le QR code du billet ne contient qu’un jeton : toutes les informations restent en base. Chaque bénévole du retrait des dossards a un téléphone. Il scanne le billet, voit l’inscription correspondante, et marque le dossard comme retiré. Un billet déjà utilisé se voit donc tout de suite. La boutique fonctionne de la même façon pour les t-shirts et les autres commandes.

Ces téléphones ont accès aux données des coureurs, alors l’accès est verrouillé à plusieurs niveaux. Les bénévoles ont des comptes temporaires, qui ne durent que le temps de l’événement. Chaque compte n’a que les permissions de son poste : retirer un dossard ou remettre une commande, rien de plus. Et l’outil est placé derrière Cloudflare Access, pour tout le monde, organisateurs compris.

La charge

La charge est restée modérée, aussi bien à l’ouverture des inscriptions que le jour J. Le choix de servir le front-end par Cloudflare Workers y aide : les informations essentielles pour les coureurs restent disponibles même si le back-end est sous pression, puisqu’elles ne passent pas par lui.

Ce que ça a donné

Sur les deux éditions, rien n’a cassé, ni pendant les inscriptions ni le jour de la course. Le fonctionnement n’a pas changé entre 2025 et 2026, mais l’édition 2026 a apporté de nouvelles fonctionnalités, comme les pseudos personnalisés ou le choix de son numéro de dossard.