Note : Cette analyse est basée sur l'ingénierie inverse de l'application mobile et reste à des fins éducatives uniquement.
Cette analyse technique est basée sur le travail initial de @szerookii.
La découverte du fonctionnement des QR codes Basic-Fit et une grande partie du travail de reverse engineering ont été réalisés par szerookii, qui a créé :
- Un blog détaillé : Les QR codes de Basic-Fit : Comment ça fonctionne
- Un repository avec une app qui contient des fonctions utiles pour interagir avec l'API Basic-Fit
Objectif de cette documentation : J'ai décidé de refaire l'analyse complète pour le challenge personnel, en m'appuyant sur les découvertes de szerookii et en approfondissant certains aspects techniques.
Script JavaScript pour générer un QR code Basic-Fit.
Comment fonctionne un QR code ? "Un QR code est un code à barres en deux dimensions qui peut stocker des informations. Lorsqu'il est scanné par un appareil compatible, il déchiffre les données encodées."
En scannant un QR code de Basic-Fit, vous obtiendrez une chaîne de caractères structurée comme suit :
GM2:CARD_NUMBER:GUID:TIMESTAMP:HASH
GM2:V001234567:ABC:1791792657:E8F87B
- GM2 : Fait référence à un format ou une spécification définie par General Motors QR Code 🤓
- V001234567 : Numéro de carte membre (identifiant unique)
- ABC : GUID aléatoire (3 caractères alphanumériques)
- 1791792657 : Timestamp Unix (en secondes)
- E8F87B : Hash SHA256 (8 derniers caractères en majuscules)
- Concaténation des données :
cardNumber + guid + timestamp + deviceId - Hashage SHA-256 : Utilisation de l'algorithme SHA
- Extraction des 8 derniers caractères : Convertis en majuscules
import { createHash } from "crypto";
function generateHash(cardNumber, guid, timestamp, deviceId) {
const dataToHash = cardNumber + guid + timestamp + deviceId;
const hash = createHash("sha256").update(dataToHash).digest("hex");
return hash.slice(-8).toUpperCase();
}
const result = generateHash(
"1234567890",
"abc-123-def",
"1640995200",
"device123",
);
console.log(result);La génération d'un QR code Basic-Fit suit un processus technique précis :
- Assemblage des données : Concaténation des composants selon le format
GM2:CARD_NUMBER:GUID:TIMESTAMP:HASH - Encodage du QR code : Transformation des données en matrice de points noirs/blancs
- Optimisation de la qualité : Application des paramètres de correction d'erreur
- Rendu visuel : Génération de l'image finale scannable
// Configuration recommandée pour un QR code Basic-Fit
const qrConfig = {
errorCorrectionLevel: "M", // Medium (15% de correction d'erreur)
type: "image/png", // Format de sortie
quality: 0.92, // Qualité de compression
margin: 1, // Marge autour du QR code
color: {
dark: "#000000", // Couleur des modules sombres
light: "#FFFFFF", // Couleur de fond
},
width: 256, // Taille en pixels (256x256 recommandé)
};Les QR codes Basic-Fit utilisent différents niveaux de qualité selon l'usage :
| Niveau | Correction | Usage Basic-Fit | Performance |
|---|---|---|---|
| L (Low) | ~7% | ❌ Non recommandé | Scan difficile |
| M (Medium) | ~15% | ✅ Utilisé par défaut | Équilibre optimal |
| Q (Quartile) | ~25% | Scan robuste | |
| H (High) | ~30% | ❌ Non nécessaire | Surdimensionné |
📁 Implementation complète : Voir le fichier QRCode-generator.js pour l'exemple pratique.
Utilisation :
# Installation des dépendances
npm install qrcode
# Génération du QR code
node QRCode-generator.jsRésultat :
- Fichier
qr-basic-fit-medium.pnggénéré - Aperçu terminal pour validation
- Logs détaillés du processus
Pour garantir une lecture optimale par les scanners Basic-Fit :
🎯 Facteurs de qualité :
- Minimum : 192x192 pixels (scan difficile)
- Optimal : 256x256 pixels (scan fiable)
- Maximum : 512x512 pixels (scan excellent, mais plus lourd)
- Contraste : Noir pur (#000000) sur blanc pur (#FFFFFF)
- Déformation : Maintenir les proportions carrées
Le deviceId est obtenu via l'API Basic-Fit après authentification (endpoint fonctionnel) :
{
"member": {
"cardnumber": "V004683024",
"country": "FR",
"homeClub": "Basic-Fit Villeurbanne Rue Hippolyte Kahn",
"deviceId": "F081C3F1-BCCF-4088-9F28-C049036E5591"
}
}Comment récupérer le deviceId :
# Utiliser le script PowerShell pour tester le compte Basic-Fit
.\basic-fit-account-explorer.ps1 -AccessToken "VOTRE_TOKEN eyJhfFjENwopDCcCI6IkpXVCJ9..."📁 Script de test : Voir le fichier basic-fit-account-explorer.ps1 pour tester tous les endpoints.
Les endpoints suivants sont confirmés fonctionnels avec un token OAuth valide :
| Endpoint | Method | URL | Description |
|---|---|---|---|
| Health Status | GET |
https://bfa.basic-fit.com/api/health |
Statut de l'API |
| Infos membre | GET |
https://bfa.basic-fit.com/api/member/info |
Informations du compte membre |
| Paramètres membre | GET |
https://bfa.basic-fit.com/api/member/settings |
Paramètres du compte |
| Visites gym | GET |
https://bfa.basic-fit.com/api/member/gym-visits-total |
Historique des visites |
| Visites limitées | GET |
https://bfa.basic-fit.com/api/member/gym-visits-total?limit={5,10,20} |
Dernières X visites |
Authorization: Bearer YOUR_ACCESS_TOKEN
User-Agent: Basic-Fit/2436 CFNetwork/1568.300.101 Darwin/24.2.0
Accept: application/json
Content-Type: application/json📁 Fichiers d'exemple : Voir les fichiers exemple_api-*.json dans le repository pour les structures de réponse complètes.
# Tester tous les endpoints
.\basic-fit-account-explorer.ps1 -AccessToken "eyJhbGciOiJFUzUxMiIsInR5cCI6IkpXVCIsImtpZCI6..."/api/member/qr-code- Génération QR code/api/member/devices- Gestion des appareils/api/member/cards- Gestion des cartes/api/clubs- Liste des clubs/api/reservations- Réservations
Raison : Ces endpoints nécessitent des permissions spéciales ou ne sont accessibles qu'à l'application mobile officielle.
- Validité : Les QR codes ont une durée de vie limitée
- Timestamp : Vérifié côté serveur pour éviter la réutilisation
- Fraîcheur : Nouveaux codes générés à chaque utilisation
- Device binding : Un QR code est lié à un appareil spécifique
- Account binding : Validé contre l'abonnement actif
- Cryptographic integrity : Hash empêche la modification
Limitation technique importante : Les endpoints API pour générer des QR codes ne sont pas accessibles au public. Seule l'application mobile officielle Basic-Fit peut générer des QR codes fonctionnels.
- Guide complet API Basic-Fit - Documentation des endpoints réellement fonctionnels
- QR Code Generator NPM - Documentation npm sur les QR codes
- Blog de szerookii- Documentation de szerookii
- QR Code Generator - Générateur de QR codes en ligne
Cette documentation à été rédigée dans un but éducatif et de partage de connaissances. Réalisée par NassCT, avec le travail/l'influence de szerookii.