2 min de lecture Mis à jour le

Vérification automatisée des attestations Athlé PPS


Dans le cadre de l’organisation des premières éditions de la course caritative Purple Rouen, j’ai développé un outil de validation automatique des attestations Parcours Prévention Santé (PPS) pour faciliter les inscriptions et garantir la conformité des participants.

Les dossiers des coureurs ont donc été validés de manière instantanée grâce à cet outil, qui a permis de réduire considérablement le temps de traitement des inscriptions et d’assurer une expérience fluide pour les participants.

Fonctionnement de l’outil de validation

Dans cet article, je vais détailler mon approche pour la création de cet outil, les défis techniques rencontrés et les résultats obtenus.

Contenu du QR code

Le QR code présent sur les attestations Athlé PPS contient un lien vers une page web sécurisée hébergée par la Fédération Française d’Athlétisme (FFA), de la forme suivante :

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

La page affiche alors les informations suivantes :

  • Numéro PPS
  • Nom
  • Date de naissance
  • Sexe
  • Valable jusqu’au

Notons que l’adresse contient également une partie data qui est un token JWT (JSON Web Token) encodé en base64, qui contient les mêmes informations que la page web. Ne disposant pas de la clé de signature pour vérifier l’authenticité du token, il n’est pas recommandé de se baser uniquement sur les données du token, qui peut alors devenir un vecteur d’attaque.

Récupération des données

Il est donc nécessaire de faire une requête HTTP à l’URL du QR code pour récupérer les données affichées sur la page web, qui sont elles vérifiées par la FFA.

L’outil remplace alors la requête manuelle de l’utilisateur par une requête automatisée. Pour y parvenir, j’ai utilisé la bibliothèque Golang net/http pour faire une requête GET à l’URL du QR code, puis j’ai utilisé la bibliothèque goquery pour parser le HTML de la page et extraire les informations nécessaires.

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

    switch strings.TrimSpace(title) {
    case "Numéro PPS":
    case "Nom":
    case "Date de naissance":
    case "Sexe":
    case "Valable jusqu'au":
    }
})

Résultats obtenus

Grâce à cet outil de validation automatisé, nous avons pu :

  • Valider les attestations de manière instantanée et fiable
  • Réduire considérablement le temps de traitement des inscriptions
  • Améliorer l’expérience utilisateur avec pré-remplissage des données

Conclusion

Ce projet a été une excellente opportunité de mettre en pratique mes compétences en développement web et en automatisation, tout en contribuant à la réussite d’un événement caritatif.