Pour les développeurs

Contrat d'appairage

Une application est compatible avec CastCat dès qu'elle propose ces trois points d'accès. CastCat affiche ensuite simplement la page que vous lui indiquez dans une WebView plein écran : le contenu, la mise en page et les réglages sont entièrement les vôtres.

1. Demander un code

POST {service}/ecran/appairage        (sans authentification)

201 { "code": "K7PM-2QXA",
      "pairingSecret": "48 caractères hexadécimaux, connus de la télé seule",
      "pairUrl": "https://service.exemple/…/appairer?code=K7PM2QXA",
      "expiresAt": "2026-11-08T21:43:49+00:00",
      "pollSeconds": 3 }
429 { "error": "…" }    trop de demandes

La télé affiche pairUrl en QR code et code en grand. pairUrl mène à une page de votre application, protégée par votre connexion habituelle, où l'utilisateur nomme l'écran et valide.

2. Attendre l'approbation

GET {service}/ecran/appairage/{pairingSecret}

200 { "status": "pending" }
200 { "status": "approved", "displayUrl": "https://service.exemple/ecran/ap/{jeton}", "screenName": "Salle" }
200 { "status": "expired" }

La télé interroge toutes les pollSeconds secondes. Le jeton n'est livré qu'une seule fois ; les appels suivants répondent expired. CastCat ne retient que le chemin de displayUrl et le recompose sur l'adresse du service, pour ne pas dépendre de ce que voit votre proxy.

3. Servir l'écran

GET {service}/ecran/ap/{jeton}

200  la page HTML à afficher
404  jeton inconnu          → CastCat repart sur l'appairage
410  écran révoqué          → CastCat repart sur l'appairage

La page se rafraîchit elle-même (CastCat ne recharge rien). En cas d'erreur réseau, CastCat affiche son propre écran « Pas de réseau » puis réessaie toutes les 10 secondes.

Recommandations de sécurité

PointPourquoi
Stocker uniquement l'empreinte (SHA-256) du jeton d'écranUne fuite de base de données ne donne accès à aucun écran.
Un jeton par écran, révocableÉcran perdu ou déplacé : on coupe cet écran seul.
Code d'appairage court, sans 0/O/1/I/L, valable ~15 minLisible de loin, impossible à deviner.
Limiter les demandes de code par adresse IPÉvite le remplissage de la base par un robot.
Aperçu et réglages derrière votre connexionSeul /ecran/ap/{jeton} est public.
Cache-Control: no-store, Referrer-Policy: no-referrer, noindexLe jeton est dans l'adresse : elle ne doit ni être cachée ni transmise.
N'afficher que le nécessaire (prénoms, pas d'e-mails)Un écran de salle est vu par tout le monde.

Référence

Le serveur de référence est Mon Club Facile (Symfony) : entités Screen et ScreenPairing, widgets configurables et page de réglages. La liste des services connus de l'application est dans services.json.