Aller au contenu

Spec — UI web Skald : consultation + auth magic-link (v0.1)

Doc avant code (CLAUDE.md §2.2). Pas de TDD (dĂ©cision mainteneur). Front → exigences OPQUAST / RGAA (CLAUDE.md §5).

Décisions validées : UI Twig dans le backend Symfony, auth maison magic-link email, mono-utilisateur (liste blanche d'emails).

1. Objectif

Une interface web pour consulter et écouter les enregistrements reçus du device, accessible aprÚs connexion sans mot de passe (lien/token envoyé par email). Domaine : skald.phracktale.com (distinct de api.skald.phracktale.com, qui reste l'API device).

2. PérimÚtre

Inclus

  • Page login : saisie email → envoi d'un lien magique.
  • VĂ©rification du lien → session authentifiĂ©e.
  • Page liste : enregistrements (Recording) triĂ©s par date, avec horodatage lisible (uploadedAt, recordedAt si prĂ©sent), durĂ©e si connue, deviceId.
  • Lecture audio dans la page (Ă©lĂ©ment <audio> natif), via une route de streaming protĂ©gĂ©e par la session.
  • DĂ©connexion.

Exclus (v0.1)

  • Inscription publique, multi-utilisateurs, rĂŽles.
  • Suppression/Ă©dition des enregistrements, recherche, pagination avancĂ©e (liste simple suffisante au dĂ©but).
  • Transcription/traduction (phases pipeline ultĂ©rieures).

3. Deux surfaces de sécurité distinctes (ne pas mélanger)

Surface Domaine Auth
API ingestion device api.skald.phracktale.com Bearer token statique (SKALD_API_TOKEN)
UI web humaine skald.phracktale.com Session aprĂšs magic-link email

Le BearerTokenSubscriber protÚge ^/api. L'UI vit hors /api (ex. /, /login, /recordings, /audio/{id}) et est protégée par le firewall Symfony (session). Les deux mécanismes restent indépendants.

4. ModÚle de données

  • User : id, email (unique). Pas de mot de passe.
  • LoginToken : id, user, tokenHash (hash du token, jamais en clair en base), expiresAt (courte durĂ©e, ex. 15 min), usedAt (usage unique). Le token clair n'existe que dans l'email.

Liste blanche d'emails autorisĂ©s via paramĂštre d'env SKALD_ALLOWED_EMAILS (le tien). Un email hors liste → pas d'envoi, message neutre (pas d'oracle d'existence de compte).

5. Flux magic-link

  1. GET /login : formulaire email (accessible, label explicite).
  2. POST /login : si email ∈ liste blanche → crĂ©er LoginToken (token alĂ©atoire fort, stockĂ© hachĂ©), envoyer l'email avec https://skald.phracktale.com/login/check?token=
. RĂ©ponse toujours neutre (« si cet email est autorisĂ©, un lien a Ă©tĂ© envoyĂ© »).
  3. GET /login/check?token=
 : token valide, non expirĂ©, non utilisĂ© → marquer usedAt, ouvrir la session, rediriger vers la liste. Sinon page d'erreur claire.
  4. Session Symfony classique ensuite ; GET /logout.

Token : random_bytes(32) → URL-safe ; comparaison en temps constant ; stockage hash('sha256', token).

6. Lecture audio

  • GET / ou /recordings (protĂ©gĂ© session) : liste Twig, triĂ©e uploadedAt desc, horodatage formatĂ© Europe/Paris, un <audio controls preload="none"> par ligne pointant /audio/{id}.
  • GET /audio/{id} (protĂ©gĂ© session) : renvoie le fichier depuis var/uploads (BinaryFileResponse, Content-Type du Recording, Accept-Ranges pour le seek). 404 si absent.

7. Accessibilité (RGAA / OPQUAST)

  • HTML sĂ©mantique : main, nav, table ou liste de dĂ©finitions avec en-tĂȘtes ; titres hiĂ©rarchisĂ©s.
  • Lecteur <audio> natif (contrĂŽles clavier natifs) ; chaque lecteur a un libellĂ© (aria-label incluant l'horodatage).
  • Formulaire login : label liĂ©, messages d'erreur explicites, focus gĂ©rĂ©.
  • Contrastes conformes, pas d'information par la couleur seule, langue fr.

8. Domaine & déploiement (Homelab)

  • Nouveau domaine skald.phracktale.com : DNS A → 82.66.11.72 (Ă  crĂ©er par le mainteneur) ; vhost Heimdall + certbot (mĂȘme procĂ©dure que api.skald), proxy vers le mĂȘme conteneur homelab_skald_app (port 18090). Un seul backend sert les deux domaines (Symfony route selon l'hĂŽte / firewall selon le path).
  • Email : Symfony Mailer via le relais Postfix de Heimdall (MAILER_DSN=smtp://192.168.1.195:25 depuis Thor — relais LAN, pas de credentials OVH dans Skald). À confirmer : joignabilitĂ© Thor→Heimdall:25 et expĂ©diteur autorisĂ© (skald@phracktale.com).
  • Nouvelles variables .env (gĂ©nĂ©rĂ©es/posĂ©es par bootstrap, jamais commitĂ©es) : SKALD_ALLOWED_EMAILS, MAILER_DSN, MAILER_FROM=skald@phracktale.com, APP_BASE_URL=https://skald.phracktale.com.

9. Plan d'implémentation (sans test)

  1. Entités User, LoginToken + migration.
  2. Auth maison : controllers /login, /login/check, /logout ; security.yaml (firewall session sur le non-/api, access_control).
  3. Mailer : service d'envoi du lien (template email texte + html sobre).
  4. UI Twig : liste + lecteur, route /audio/{id} protégée.
  5. Artefacts Homelab : vhost skald.phracktale.com.conf, maj port-routing-table.md, bootstrap (nouvelles vars + MAILER).
  6. VĂ©rif manuelle : login email → lien → liste → lecture d'un sample.

10. Inconnues Ă  lever

  • DNS skald.phracktale.com (mainteneur).
  • DSN SMTP rĂ©el / relais Heimdall joignable depuis Thor (Ă  tester).
  • ExpĂ©diteur skald@phracktale.com acceptĂ© par le relais OVH.

11. Sources

  • _DOCS/contexte.md §5 (stack Symfony), SECURITY.md.
  • HOMELAB/.../secrets-management.md (relais SMTP Postfix Heimdall, OVH).
  • RGAA 4.1 / OPQUAST (exigences front du projet).

Connexion

Saisissez votre email : si vous ĂȘtes autorisé·e, un lien de connexion (15 min, usage unique) vous est envoyĂ©.

Page de connexion (sans JavaScript)